Wie starte / beende / starte ich launchd services von der Kommandozeile aus?

149

Wie starte ich neu, z. B. mein httpd oder afpd, unter Mac OS X> = 10.5 (Leopard-), ohne die grafische Benutzeroberfläche verwenden zu müssen, und gehe zu Systemeinstellungen -> Freigeben und Deaktivieren / Aktivieren von "Webfreigabe"?

Ich suche das kanonische Äquivalent zu Debian invoke-rc.d apache2 restart.

EDIT: Die Frage bezieht sich auf gesteuerte Dienste im Allgemeinen , nicht speziell auf Apache (was einfach ein Beispiel war).

conny
quelle
1
Ist es nach den bisherigen Antworten richtig anzunehmen, dass es keinen einzelnen launchctl-Befehl zum Neustarten eines Dienstes gibt?
JS.
@JS. Laut der Handbuchseite scheint kickstartzusammen mit der -kOption der Trick zu sein. Siehe meine Antwort unten ...
Jochen

Antworten:

158

Hallo launchctl (8) ist dein Freund. Bedenken Sie jedoch, dass einige der Dienste (z. B. sshd) in der Konfigurationsdatei deaktiviert sind, sodass Sie -wbeim Laden den Schalter verwenden müssen. Hier ist ein SSHD-Beispiel:

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

Sie können den Dienst mit dem unloadUnterbefehl beenden .

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

Verwenden Sie den Unterbefehl 'list', um die Dienste aufzulisten, wie Sie vielleicht schon vermutet haben;)

Hab Spaß

Nayden
quelle
9
Darüber hinaus launchctl listbeschwert sich nicht, zeigt aber nicht alles, sudo launchctl listwas dazu benötigt wird.
Conny
9
Es ist nicht so, dass es nicht alles zeigt, es zeigt eine ganz andere Liste. Wenn Sie launchctlals normaler Benutzer ausgeführt werden, werden LaunchAgents angezeigt / verwaltet, die in Ihrer Benutzersitzung ausgeführt werden. Als root ausgeführt, zeigt / verwaltet es die systemweiten LaunchDaemons.
Gordon Davisson
1
Ich kann "com.openssh.sshd" in dieser Liste sehen, also denke ich, dass die Konfiguration "geladen" ist. Nun, wie kommt es zum Beispiel sudo launchctl start com.openssh.sshdnicht tut nichts , nicht evan mit einer Fehlermeldung fehlschlagen, noch weniger tatsächlich etwas starten?
Conny
2
@conny Es kann im Allgemeinen verwirrend sein. Wenn Sie jedoch einen Dienst schreiben und beispielsweise vermuten, dass beim Start etwas Schlimmes passiert, können Sie ihn einmal laden und das Problem mit 'stop' / 'start' debuggen .
Nayden
6
Warum keine Erwähnung von launchctl start <label>oder launchctl stop <label>? Wenn es bereits mit launchctl gestartet wurde, muss die plist-Datei nicht erneut geladen werden (sofern sie nicht auch geändert wurde?). Es ist ärgerlich , gibt es keinen restartoder reloadBefehl. Kennt jemand eine Ein-Befehl-Methode, um (zum Beispiel) Mongod dazu zu bringen, eine Konfigurationsdateiänderung zu übernehmen? Ich bin einfach nicht zufrieden mit ... stop ... && ... start ....
Brian
7

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


quelle
5

Um einen Dienst neu zu starten, können Sie den launchctl kickstartBefehl zusammen mit der -kOption verwenden. Zum Neustarten von Apache können Sie beispielsweise verwenden

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

Diese Informationen stammen von der launchctlHandbuchseite:

 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
quelle
1
Als ich dies versuchte, hatte mein Dienst aufgehängt, es hörte nach einer kurzen Wartezeit nicht auf, "kill" auf dem PID half nicht, "kill -9" auf dem PID zu tun, tötete den Prozess und ließ Kickstart (das war in einem anderen gelaufen) Konsole, während ich versucht habe, den Vorgang abzubrechen), fahren Sie fort und starten Sie den Dienst erneut. Ich habe nicht lange gewartet, bevor ich anfing, Dinge manuell zu töten, also hätte es vielleicht ausreichen können, lange genug zu warten, um das Problem zu lösen.
Samuel Åslund
3

Sie könnten es einfach tun

sudo launchctl stop com.openssh.sshd

Wenn Sie den vollständigen Dienstnamen nicht kennen, können Sie dies tun

sudo launchctl list

Wenn Sie den erwarteten Dienst immer noch nicht finden, versuchen Sie, ihn ohne die Root-Identität auszuführen:

launchctl list

Und Sie müssen den Service nicht entladen und laden.

Dmitriy Apollonin
quelle
1
Ich habe es versucht und kann es jetzt nicht mehr sshvon meinem Mac aus verwenden. Neustart lässt sich nicht beheben. Ersetzen stopdurch startauch behebt nicht.
P i
1
Ich habe es versucht und ich kann immer noch auf meinen Mac ssh!
Michael
@ Dmitriy-Apollonin Es funktioniert nicht, Sie müssen sudo unload /System/Library/LaunchDaemons/ssh.pliststattdessen verwenden.
SebMa
Die Frage launchctl stopbetrifft den Neustart eines Dienstes, aber ich glaube nicht, dass dies einen Dienst neu startet.
jochen
2

Sie suchen nach 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
quelle
2
Aber das Lesen der Manpage sagt mir nicht, was das Äquivalent von invoke-rc.d my-little-daemon restartbeidem ist ... Es bezieht sich auf "job_label", sagt mir aber nicht, wie ich die verfügbaren "job_label" auflisten soll.
Conny
Ich denke, Naydens Antwort hat dies abgedeckt.
Eric.s
2

Für den Fall, dass Sie nach etwas suchen launchctl reload, können Sie die Shell-Funktion ~/.bashrc/.zshrcwie folgt definieren:

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
}

Die Befehlsausführung sieht aus wie -> lctl reload <your-plist-name>.plist

Dzmitry Hubin
quelle
1
sudo apachectl restart

Funktioniert mit anderen Betriebssystemen sowie mit Apache.

Sven
quelle
1
Obwohl das Thema Apache nicht besonders erwähnt, hätte ich diese Interpretation vorwegnehmen sollen ... Es tut mir leid, aber das war nicht das, wonach ich gesucht habe :)
conny
Ok, ich habe den httpd-Teil gefunden, für den die Verwendung von apachectl die einfachere Variante ist :)
Sven
0

Es gibt eine kleine und nützliche App mit dem Namen Lingon. Lingon Freeware Edition ist hier manchmal Neustart eines Dienstes kann schwierig sein.

syslog -w

Lesen hilft aber.

Risyasin
quelle