¿Cómo iniciar / detener / reiniciar los servicios de launchd desde la línea de comandos?

149

¿Cómo reinicio, por ejemplo, mi httpd o afpd, ejecutando cualquier Mac OS X> = 10.5 (Leopard-), sin tener que usar la GUI e ir a Preferencias del sistema -> Compartir y desmarcar / marcar "Web Sharing"?

Estoy buscando el equivalente canónico al de Debian invoke-rc.d apache2 restart.

EDITAR: La pregunta es acerca de los servicios controlados por lanzamiento en general , no específicamente de Apache (-que fue simplemente un ejemplo).

conny
fuente
1
De las respuestas hasta ahora, ¿es correcto suponer que no hay un solo comando launchctl para reiniciar un servicio?
JS.
@JS. De acuerdo con la página del manual, kickstartjunto con la -kopción parece hacer el truco. Vea mi respuesta a continuación ...
jochen

Respuestas:

158

Hola launchctl (8) es tu amigo. Solo tenga en cuenta que algunos de los servicios (por ejemplo, sshd) están deshabilitados en el archivo de configuración, por lo que deberá usar el -winterruptor al cargarlos. Aquí hay un ejemplo de sshd:

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

Puede detener el servicio utilizando el unloadsubcomando.

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

Para enumerar los servicios, como ya habrás adivinado, utiliza el subcomando 'list';)

Diviértete

nayden
fuente
99
Además, launchctl listno se queja pero no muestra todo, sudo launchctl listes necesario para eso.
conny
99
No es que no muestre todo, muestra una lista completamente diferente. Cuando se ejecuta launchctlcomo un usuario normal, muestra / administra LaunchAgents ejecutándose en su sesión de usuario; ejecutado como root, muestra / administra los LaunchDaemons en todo el sistema.
Gordon Davisson
1
Puedo ver "com.openssh.sshd" en esa lista, así que supongo que esa configuración está "cargada". Ahora, ¿cómo es que, por ejemplo sudo launchctl start com.openssh.sshd, no hace nada , ni evan falla con un mensaje de error, y mucho menos lanza realmente algo?
conny
2
@conny Puede ser confuso en el caso general, sin embargo, cuando está escribiendo un servicio y sospecha, por ejemplo, que algo desagradable está sucediendo en el inicio, puede cargarlo una vez y usar 'detener' / 'iniciar' para depurar el problema .
nayden
66
¿Por qué no se menciona launchctl start <label>o launchctl stop <label>? Si ya se inició con launchctl, no es necesario volver a cargar el archivo plist (a menos que también haya cambiado). Es molesto que no haya restarto reloadcomando. ¿Alguien sabe de una manera de un solo comando de hacer (por ejemplo) que mongod recoja un cambio de archivo de configuración? Simplemente no estoy satisfecho con ... stop ... && ... start ....
Brian
7

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


fuente
5

Para reiniciar un servicio, puede usar el launchctl kickstartcomando, junto con la -kopción. Por ejemplo, para reiniciar Apache, puede usar

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

Esta información es de la launchctlpágina del 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
fuente
1
Cuando probé esto, mi servicio se había bloqueado, no se detuvo después de una corta espera, "matar" en el pid no ayudó, hacer "matar -9" en el pid interrumpió el proceso y dejó que kickstart (que se había estado ejecutando en otro consola mientras trataba de matar el proceso) continuar e iniciar el servicio nuevamente. No esperé mucho tiempo antes de comenzar a matar cosas manualmente, por lo que esperar lo suficiente podría haber sido suficiente para resolver el problema.
Samuel Åslund
3

Podrías simplemente hacer

sudo launchctl stop com.openssh.sshd

Si no conoce el nombre completo del servicio, puede hacerlo

sudo launchctl list

Si aún no encuentra el servicio que esperaba, intente ejecutar sin la identidad raíz:

launchctl list

Y no necesita descargar y cargar el servicio.

Dmitriy Apollonin
fuente
1
Intenté esto y ahora no puedo usarlo sshdesde mi Mac. Reiniciar no soluciona. Reemplazar stopcon starttampoco soluciona.
P i
1
¡Intenté esto y todavía puedo enviar ssh a mi Mac!
Michael
@ dmitriy-apollonin No funciona, debes usarlo sudo unload /System/Library/LaunchDaemons/ssh.plisten su lugar.
SebMa
La pregunta es sobre reiniciar un servicio, pero no creo que launchctl stopreinicie un servicio.
jochen
2

Que busca 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
fuente
2
Pero leer la página de manual no me dice cuál es el equivalente de ninguno de los dos invoke-rc.d my-little-daemon restart... Se refiere a "etiqueta de trabajo" pero no me dice cómo enumerar las "etiquetas de trabajo" disponibles.
conny
Creo que la respuesta de nayden tiene esto cubierto.
eric.s
2

En caso de que esté buscando launchctl reload, puede definir la función de shell en su ~/.bashrc/.zshrccomo lo hice:

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
}

La ejecución del comando se parece a -> lctl reload <your-plist-name>.plist

Dzmitry Hubin
fuente
1
sudo apachectl restart

Funciona con otros sistemas operativos y es parte de Apache.

Sven
fuente
1
Aunque el tema no menciona el apache en particular, debería haber previsto esta interpretación ... Lo siento, pero eso no era lo que estaba buscando :)
conny
Ok, capté la parte httpd, para la cual usar apachectl es la variante más fácil :)
Sven