Как запустить / остановить / перезапустить запущенные сервисы из командной строки?

149

Как перезапустить, скажем, например, мой httpd или afpd, используя любую Mac OS X> = 10.5 (Leopard-), без необходимости использовать графический интерфейс и перейти в Системные настройки -> Общий доступ и снятие отметки / проверки «Общий доступ через Интернет»?

Я ищу канонический эквивалент Debian invoke-rc.d apache2 restart.

РЕДАКТИРОВАТЬ: Вопрос о запущенных контролируемых службах в целом , а не конкретно Apache (который был просто примером).

Конни
источник
1
Из ответов на этот вопрос, правильно ли предположить, что нет единой команды launchctl для перезапуска службы?
JS.
@JS. Согласно странице руководства, kickstartвместе с -kопцией, кажется, делать свое дело. Смотрите мой ответ ниже ...
Йохен

Ответы:

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';)

веселиться

Найден
источник
9
Кроме того, launchctl listне жалуется, но не показывает все, sudo launchctl listдля этого нужно.
Конни
9
Дело не в том, что он показывает не все, а совершенно другой список. Когда вы работаете launchctlкак обычный пользователь, он показывает / управляет LaunchAgents, запущенными в вашей пользовательской сессии; запуск от имени пользователя root показывает / управляет общесистемными LaunchDaemons.
Гордон Дэвиссон
1
Я вижу «com.openssh.sshd» в этом списке, поэтому я думаю, что config «загружен». Теперь, как же, например , sudo launchctl start com.openssh.sshdне делает ничего , не Evan неудачно с сообщением об ошибке, даже меньше , так что на самом деле запустить что - нибудь?
Конни
2
@conny В общем случае это может сбить с толку, однако, когда вы пишете сервис и подозреваете, например, что при запуске происходит что-то неприятное, вы можете загрузить его один раз и использовать «stop» / «start» для устранения проблемы. ,
найден
6
Почему нет упоминания launchctl start <label>или launchctl stop <label>? Если он уже запущен launchctl, нет необходимости перезагружать файл plist (разве он также изменился?). Это раздражает, нет restartили reloadкоманды. Кто-нибудь знает способ, с помощью одной команды (например, mongod) изменить конфигурационный файл? Я просто не доволен ... stop ... && ... start ....
Брайан
7

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


источник
5

Чтобы перезапустить сервис, вы можете использовать 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.
          [...]
Jochen
источник
1
Когда я попробовал это сделать, мой сервис завис, после короткого ожидания он не остановился, «kill» на pid не помог, выполнение «kill -9» на pid завершило процесс и позволило запустить kickstart (запущенный в другом консоль, пока я пытался убить процесс) продолжить и снова запустить службу. Я не очень долго ждал, прежде чем начать убивать вещи вручную, поэтому достаточно было подождать достаточно долго, чтобы решить проблему.
Самуэль Ослунд
3

Вы могли бы просто сделать

sudo launchctl stop com.openssh.sshd

Если вы не знаете полное имя службы, вы можете сделать

sudo launchctl list

Если вы все еще не нашли ожидаемую службу, попробуйте запустить ее без идентификации root:

launchctl list

И вам не нужно выгружать и загружать сервис.

Дмитрий Аполлонин
источник
1
Я попробовал это, и теперь я не могу использовать sshс моего Mac. Перезагрузка не исправляет. Замена stopна startтакже не исправляет.
П и я
1
Я попробовал это, и я все еще могу SSH к моему Mac!
Майкл
@ dmitriy-apollonin Это не работает, вы должны использовать sudo unload /System/Library/LaunchDaemons/ssh.plistвместо этого.
SebMa
Вопрос о перезапуске службы, но я не думаю, что launchctl stopэто перезапускает службу.
Йохен
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.
eric.s
источник
2
Но чтение man-страницы не говорит мне, что является эквивалентом того или invoke-rc.d my-little-daemon restartиного ... Это относится к «job_label», но не говорит мне, как перечислить доступные «job_label».
Конни
Я думаю, что ответ Найдена покрыл это.
eric.s
2

На всякий случай, если вы ищете launchctl reload, вы можете определить функцию оболочки в вашем, ~/.bashrc/.zshrcкак я сделал:

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

Работает с другими ОС, а также является частью Apache.

Свен
источник
1
Несмотря на то, что в теме не упоминается apache, в частности, я должен был предвидеть эту интерпретацию .... Извините, но это было не то, что я искал :)
Конни
Хорошо, я перехватил часть httpd, для которой использование apachectl является более простым вариантом :)
Sven