Comment démarrer / arrêter / redémarrer les services launchd à partir de la ligne de commande?

149

Comment redémarrer, par exemple, httpd ou afpd, sous Mac OS X> = 10.5 (Leopard-), sans devoir utiliser l'interface graphique et se rendre dans Préférences Système -> Partage et décocher / cocher "Partage Web"?

Je cherche l'équivalent canonique de Debian invoke-rc.d apache2 restart.

EDIT: La question concerne les services contrôlés launchd en général , pas spécifiquement Apache (qui était simplement un exemple).

conny
la source
1
D'après les réponses fournies jusqu'à présent, est-il correct de supposer qu'il n'existe pas de commande launchctl unique pour redémarrer un service?
JS.
@JS. Selon la page de manuel, kickstartavec l' -koption semble faire l'affaire. Voir ma réponse ci-dessous ...
Jochen le

Réponses:

158

Salut Launchctl (8) est votre ami. Gardez simplement à l'esprit que certains des services (sshd par exemple) sont désactivés dans le fichier de configuration. Vous devrez donc utiliser le -wcommutateur pour les charger. Voici un exemple sshd:

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

Vous pouvez arrêter le service à l'aide de la unloadsous - commande.

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

Comme vous l'avez peut-être déjà deviné, utilisez la sous-commande 'list' pour lister les services;)

amuses-toi

Nayden
la source
9
En outre, launchctl listne se plaint pas mais ne montre pas tout, il sudo launchctl listfaut pour cela.
Conny
9
Ce n'est pas qu'il ne montre pas tout, il montre une liste complètement différente. Lorsque vous vous exécutez en launchctltant qu'utilisateur normal, il affiche / gère les LaunchAgents en cours d'exécution dans votre session utilisateur. exécuté en tant que root, il affiche / gère les LaunchDaemons à l’échelle du système.
Gordon Davisson
1
Je peux voir "com.openssh.sshd" dans cette liste, donc je suppose que config est "chargé". Maintenant, comment se fait-il que, par exemple, sudo launchctl start com.openssh.sshdne fasse rien , qu’il n’existe pas un message d’erreur, et encore moins qu’il lance quelque chose?
Conny
2
@conny Cela peut être déroutant dans le cas général, cependant, lorsque vous écrivez un service et que vous soupçonnez par exemple que quelque chose de désagréable se produit au démarrage, vous pouvez le charger une fois et utiliser 'stop' / 'start' pour résoudre le problème. .
Nayden
6
Pourquoi aucune mention de launchctl start <label>ou launchctl stop <label>? Si cela a déjà été lancé par launchctl, il n'est pas nécessaire de recharger le fichier plist (à moins que cela ne change aussi?). Il est ennuyeux il n'y a pas restartou reloadcommande. Quelqu'un connaît-il une méthode à commande unique pour effectuer (par exemple) Mongod un changement de fichier de configuration? Je ne suis simplement pas satisfait de ... stop ... && ... start ....
Brian
7

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


la source
5

Pour redémarrer un service, vous pouvez utiliser la launchctl kickstartcommande avec l' -koption. Par exemple, pour redémarrer Apache, vous pouvez utiliser

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

Ces informations proviennent de la launchctlpage de manuel:

 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
la source
1
Quand j’ai essayé, mon service s’est arrêté, il ne s’est pas arrêté après une courte attente, "kill" sur le pid n’aide pas, faire "kill -9" sur le pid a tué le processus et laissé kickstart (qui fonctionnait dans un autre console alors que j’essayais de tuer le processus) continuez et redémarrez le service. Je n’ai pas attendu très longtemps avant de commencer à tuer les choses à la main, donc attendre assez longtemps aurait pu suffire à résoudre le problème.
Samuel Åslund le
3

Vous pourriez simplement faire

sudo launchctl stop com.openssh.sshd

Si vous ne connaissez pas le nom complet du service, vous pouvez le faire.

sudo launchctl list

Si vous ne trouvez toujours pas le service attendu, essayez de l'exécuter sans l'identité racine:

launchctl list

Et vous n'avez pas besoin de décharger et de charger le service.

Dmitriy Apollonin
la source
1
J'ai essayé cela et maintenant je ne peux plus l'utiliser sshdepuis mon Mac. Le redémarrage ne répare pas. Remplacer stoppar startaussi ne résout pas le problème.
P i
1
J'ai essayé cela et je peux toujours ssh sur mon Mac!
Michael
@ Dmitriy-Apollonin Cela ne fonctionne pas, vous devez utiliser à la sudo unload /System/Library/LaunchDaemons/ssh.plistplace.
SebMa
La question concerne le redémarrage d'un service, mais je ne pense pas que launchctl stopcela redémarre un service.
Jochen
2

Vous recherchez 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
la source
2
Mais la lecture de la page de manuel ne me dit pas quel est l’équivalent de l’un ou l’autre invoke-rc.d my-little-daemon restart... Cela fait référence à "label_travail" mais ne me dit pas comment répertorier les "labels_travail" disponibles.
Conny
Je pense que la réponse de Nayden a couvert cela.
eric.s
2

Juste au cas où si vous recherchez launchctl reload, vous pouvez définir la fonction shell dans votre ~/.bashrc/.zshrccomme je l'ai fait:

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
}

L'exécution de la commande ressemble à -> lctl reload <your-plist-name>.plist

Dzmitry Hubin
la source
1
sudo apachectl restart

Fonctionne avec d'autres OSses et fait partie d'Apache.

Sven
la source
1
Même si le sujet ne mentionne pas Apache en particulier, j'aurais dû anticiper cette interprétation ... Je m'excuse, mais ce n'est pas ce que je cherchais :)
conny
Ok, j’ai attrapé la partie httpd, pour laquelle utiliser apachectl est la variante la plus simple :)
Sven
0

Il existe une petite application utile pour ce Lingon nommé. L'édition gratuite de Lingon est ici parfois, le redémarrage d'un service peut être délicat.

syslog -w

la lecture aide cependant.

risyasin
la source