Como iniciar / parar / reiniciar os serviços launchd a partir da linha de comando?

149

Como reinicio, digamos, por exemplo, meu httpd ou afpd, executando qualquer Mac OS X = 10.5 (Leopard-), sem precisar usar a GUI e ir para Preferências do Sistema -> Compartilhar e desmarcar / marcar "Compartilhamento da Web"?

Estou procurando o equivalente canônico do Debian invoke-rc.d apache2 restart.

EDIT: A pergunta é sobre serviços controlados iniciados em geral , não especificamente sobre o Apache (que era simplesmente um exemplo).

conny
fonte
1
A partir das respostas até agora, é correto supor que não haja um único comando launchctl para reiniciar um serviço?
JS.
@JS. De acordo com a página do manual, kickstartjunto com a -kopção parece fazer o truque. Veja minha resposta abaixo ...
jochen

Respostas:

158

Olá, launchctl (8) é seu amigo. Lembre-se de que alguns dos serviços (sshd por exemplo) estão desabilitados no arquivo de configuração; portanto, você precisará usar o -wcomutador ao carregá-los. Aqui está um exemplo do sshd:

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

Você pode parar o serviço usando o unloadsubcomando.

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

Para listar os serviços, como você já deve ter adivinhado, use o subcomando 'list';)

Divertir-se

nayden
fonte
9
Além disso, launchctl listnão reclama, mas não mostra tudo, sudo launchctl listé necessário para isso.
conny
9
Não é que não mostre tudo, mostra uma lista completamente diferente. Quando você executa launchctlcomo um usuário normal, ele mostra / gerencia os LaunchAgents em execução na sua sessão de usuário; executado como root, mostra / gerencia os LaunchDaemons em todo o sistema.
Gordon Davisson
1
Eu posso ver "com.openssh.sshd" nessa lista, então acho que a configuração está "carregada". Agora, como, por exemplo sudo launchctl start com.openssh.sshd, não faz nada , nem falha com uma mensagem de erro, menos ainda assim, na verdade, lança qualquer coisa?
26510
2
@conny Pode ser confuso no caso geral, no entanto, quando você está escrevendo um serviço e suspeita, por exemplo, que algo desagradável está acontecendo na inicialização, você pode carregá-lo uma vez e usar 'stop' / 'start' para depurar o problema .
Nayden 28/10/10
6
Por que nenhuma menção launchctl start <label>ou launchctl stop <label>? Se já foi iniciado pelo launchctl, não há necessidade de recarregar o arquivo plist (a menos que ele também tenha mudado?). É chato não existe restartou reloadcomando. Alguém conhece uma maneira de comando único de fazer (por exemplo) o mongod pegar uma alteração no arquivo de configuração? Só não estou satisfeito ... stop ... && ... start ....
18715 Brian
7

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


fonte
5

Para reiniciar um serviço, você pode usar o launchctl kickstartcomando, juntamente com a -kopção Por exemplo, para reiniciar o apache, você pode usar

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

Esta informação é da launchctlpágina do manual:

 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
fonte
1
Quando tentei isso, meu serviço travou, mas ele não parou após uma breve espera, "matar" no pid não ajudou, ao fazer "kill -9" no pid interrompeu o processo e deixou o kickstart (que estava sendo executado em outro console enquanto eu tentava interromper o processo) continue e inicie o serviço novamente. Não esperei muito tempo antes de começar a matar as coisas manualmente; portanto, esperar o suficiente pode ter sido suficiente para resolver o problema.
Samuel Åslund 28/06
3

Você poderia simplesmente fazer

sudo launchctl stop com.openssh.sshd

Se você não souber o nome completo do serviço, poderá fazer

sudo launchctl list

Se você ainda não encontrar o serviço esperado, tente executar sem a identidade raiz:

launchctl list

E você não precisa descarregar e carregar o serviço.

Dmitriy Apollonin
fonte
1
Eu tentei isso e agora não consigo usar sshno meu Mac. A reinicialização não é corrigida. Substituir stoppor starttambém não corrige.
1 de
1
Eu tentei isso e ainda posso fazer o ssh no meu Mac!
Michael
@ dmitriy-apollonin Não funciona, você deve usar sudo unload /System/Library/LaunchDaemons/ssh.plist.
SebMa
A pergunta é sobre como reiniciar um serviço, mas não acho que launchctl stopisso reinicie um serviço.
jochen 3/01
2

Você está procurando 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
fonte
2
Mas ler a página de manual não me diz qual é o equivalente de qualquer invoke-rc.d my-little-daemon restartum ... Refere-se a "job_label", mas não me diz como listar os "job_label" disponíveis.
conny
Eu acho que a resposta de nayden tem isso coberto.
eric.s
2

Apenas no caso de você estar procurando launchctl reload, você pode definir a função shell no seu ~/.bashrc/.zshrccomo eu fiz:

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
}

A execução do comando parece -> lctl reload <your-plist-name>.plist

Dzmitry Hubin
fonte
1
sudo apachectl restart

Funciona com outros sistemas operacionais e faz parte do Apache.

Sven
fonte
1
Mesmo que o tópico não menciona apache em particular, eu deveria ter previsto essa interpretação .... Sinto muito, mas isso não era o que eu estava procurando :)
conny
Ok, peguei a parte httpd, para a qual o uso do apachectl é a variante mais fácil :)
Sven
0

Há um aplicativo pequeno e útil para este chamado Lingon. A edição gratuita do Lingon está aqui algumas vezes, reiniciar um serviço pode ser complicado.

syslog -w

ler ajuda embora.

risyasin
fonte