2017-08-10 1 views
4

Ich schreibe ein Programm, das mit einem Dienst geliefert wird. Was ich bis jetzt gemacht habe, ist ein Hilfswerkzeug zu erstellen, das erhöhte Aufgaben für meinen Prozess ausführen kann und über XPC kommunizieren kann.Aktivieren, deaktivieren und starten Sie Dienste programmgesteuert in macOS

Mein Programm wird mit einem Dienst geliefert und ich möchte das Hilfsprogramm verwenden, um diesen Dienst zu installieren und zu starten/stoppen, damit mein Programm in den Einstellungen das Kontrollkästchen "Dienst mit System starten" aktivieren kann.

Ich kann die PLIST für den Dienst erfolgreich kopieren, aber ich kann keine Möglichkeit finden, den Dienst programmgesteuert zu aktivieren, zu deaktivieren, zu starten oder zu beenden. Ich finde die Lösung system("launchctl load /path/to/service.plist"); ziemlich hässlich zu nennen. Gibt es einen Mechanismus in Ziel C, um diese Aufgabe zu erfüllen und einen Erfolg oder ein gescheitertes Ergebnis zu erhalten?

+0

https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html#//apple_ref/doc/uid/10000172i-SW6-SW1 haben Sie das überprüft, ob das erfüllt Ihre Bedürfnisse? –

+0

Es tut es nicht. Ich brauche es für einen LaunchDaemon, keinen LaunchAgent. – Nidhoegger

Antwort

1

Apple hat eine veraltete C-API zum Starten, Stoppen und Aktivieren von Launchd-Diensten in launch.h. Der Quellcode für die API auf ihre Open-Source-Website ist: https://opensource.apple.com/source/launchd/launchd-442.26.2/liblaunch/

Hier einige Beispielcode, der launchd fragt den LittleSnitchUIAgent-Dienst zu starten:

#include <launch.h> 

int main(int argc, const char * argv[]) { 
    const char *job = "at.obdev.LittleSnitchUIAgent"; 
    launch_data_t resp, msg; 
    msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY); 
    launch_data_dict_insert(
     msg, launch_data_new_string(job), LAUNCH_KEY_STARTJOB); 
    resp = launch_msg(msg); 
    launch_data_free(msg); 
    return 0; 
} 

Die LittleSnitchUIAgent ist nicht Bedeutung - ich wählte sie zufällig von meiner lokalen Liste der Dienstleistungen. Ich habe Fehler aus der Probe heraus gelassen, um es geradeaus zu halten.

Wenn Sie nicht bereits ich würde empfehlen, die launchd man pages und die Daemons and Services Programming Guide eine sehr enge Studie zu geben. Launchd kann Ihre Prozesse als Reaktion auf fast alles starten: einen Timer, eine Socket-Verbindung, ein Gerät, das dem System hinzugefügt wird, und viele andere. Es ist selten, dass Sie Ihre eigenen Dienste verwalten müssen. Ich konnte das nicht bestätigen, aber ich vermute, das ist der Grund, warum sie die API nicht mehr verwenden.

+0

Vielen Dank für diese Art von Informationen. Ich habe es jetzt wirklich gemacht, indem ich eine XPC-Verbindung zu dem Dienst geöffnet habe, und launchd startet es bei einer eingehenden Verbindung auf Anforderung. – Nidhoegger

Verwandte Themen