如何从命令行启动/停止/重新启动已启动的服务?


149

如何重新启动(例如说我的httpd或afpd),运行任何Mac OS X> = 10.5(Leopard-),而不必使用GUI并转到“ 系统偏好设置”-> “共享”,然后取消选中/选中“ Web共享”?

我正在寻找与Debian的规范相等的规范invoke-rc.d apache2 restart

编辑:问题是关于一般启动的受控服务,而不是专门针对Apache(这只是一个示例)。


1
从到目前为止的答案来看,假设没有单个launchctl命令来重新启动服务是正确的吗?
JS。

@JS。根据手册页,kickstart使用共同-k的选择似乎这样的伎俩。请参阅下面的答案...
jochen

Answers:


158

嗨launchctl(8)是您的朋友。请记住,某些服务(例如sshd)在配置文件中被禁用,因此-w在加载它们时需要使用开关。这是一个sshd示例:

$ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 

您可以使用unload子命令停止该服务。

$ sudo launchctl unload  /System/Library/LaunchDaemons/ssh.plist 

要列出服务,您可能已经猜到了,请使用'list'子命令;)

玩得开心,n


9
另外,launchctl list对此不抱怨但不显示所有内容sudo launchctl list
conny 2010年

9
不是说它没有显示所有内容,而是显示了完全不同的列表。当您launchctl以普通用户身份运行时,它将显示/管理在用户会话中运行的LaunchAgent。以root身份运行,它显示/管理系统范围的LaunchDaemons。
戈登·戴维森

1
我可以在该列表中看到“ com.openssh.sshd”,因此我猜该配置已“加载”。现在,例如sudo launchctl start com.openssh.sshd,为什么什么都不做,没有evan失败并显示错误消息,甚至更少实际启动任何事情?
康妮

2
@conny在一般情况下可能会造成混淆,但是,当您编写服务时,例如怀疑启动时发生了令人讨厌的事情,则可以加载一次并使用'stop'/'start'调试问题。
登2010年

6
为什么不提launchctl start <label>launchctl stop <label>?如果已经由launchctl启动,则无需重新加载plist文件(除非也进行了更改?)。这是恼人的,没有restartreload命令。有谁知道使用单命令方式(例如)让mongod更改配置文件?我只是不满意... stop ... && ... start ...
布赖恩

7

sudo launchctl加载-w /System/Library/LaunchDaemons/org.apache.httpd.plist


4

要重新启动服务,可以将launchctl kickstart命令与-k选项一起使用。例如,要重新启动apache,可以使用

sudo launchctl kickstart -k system/org.apache.httpd

此信息来自launchctl手册页:

 kickstart [-kp] service-target
          Instructs launchd to run the specified service immediately, regardless of its
          configured launch conditions.

          -k       If the service is already running, kill the running instance before
                   restarting the service.
          [...]

1
当我尝试将此服务挂起时,它在短暂的等待后没有停止,对pid的“ kill”没有帮助,对pid进行的“ kill -9”杀死了该进程,并让kickstart(该命令在另一个进程中运行)控制台,但我尝试终止该进程)继续并再次启动该服务。我没有等很久才开始手动杀死事物,因此等待足够长的时间可能足以解决问题。
塞缪尔·奥斯隆德

3

你可以做

sudo launchctl stop com.openssh.sshd

如果您不知道完整的服务名称,则可以

sudo launchctl list

如果仍然找不到所需的服务,请尝试在没有根身份的情况下运行:

launchctl list

而且您不需要卸载和加载服务。


1
我试过了,现在无法ssh在Mac上使用。重新启动无法修复。更换stopstart也没有解决。
P I

1
我尝试了此操作,但仍然可以在Mac上使用ssh!
迈克尔”

@ dmitriy-apollonin它不起作用,必须sudo unload /System/Library/LaunchDaemons/ssh.plist改用。
SebMa '18

问题是关于重新启动服务,但是我认为那launchctl stop不会重新启动服务。
jochen

2

您正在寻找launchctl

SYNOPSIS
 launchctl [subcommand [arguments ...]]

DESCRIPTION
 launchctl interfaces with launchd to load, unload daemons/agents and gen-
 erally control launchd.  launchctl supports taking subcommands on the
 command line, interactively or even redirected from standard input.
 These commands can be stored in $HOME/.launchd.conf or /etc/launchd.conf
 to be read at the time launchd starts.

2
但是,阅读手册页并没有告诉我两者的等效invoke-rc.d my-little-daemon restart内容。它指的是“ job_label”,但没有告诉我如何列出可用的“ job_label”。
conny 2010年

我认为奈登的回应已经涵盖了这一点。
eric.s 2010年

2

以防万一,如果您正在寻找launchctl reload,可以~/.bashrc/.zshrc像我一样在您的程序中定义shell函数:

function lctl {
    COMMAND=$1
    PLIST_FILE=$2
    if [ "$COMMAND" = "reload" ] && [ -n "$PLIST_FILE" ]
      then
        echo "reloading ${PLIST_FILE}.."
        launchctl unload ${PLIST_FILE}
        launchctl load ${PLIST_FILE}
      else
        echo "either command not specified or plist file is not defined"
    fi
}

命令执行看起来像-> lctl reload <your-plist-name>.plist


1
sudo apachectl restart

与其他OS一起使用,并且它是Apache的一部分。


1
即使该主题没有特别提到apache,我也应该预料到这种解释。。很抱歉,但这不是我想要的:)
conny

好的,我抓住了httpd部分,对于该部分,使用apachectl是更简单的方法:)
Sven

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.