Wie führe ich einen launchd-Befehl als root aus?

45783
Emmanuel Mwangi

Ich habe den folgenden Befehl launchctl als .plist-Datei. Es wird geladen und ist einmal täglich ausgeführt, muss aber als Root ausgeführt werden, und ich bin nicht sicher, wie ich das überprüfen kann.

Auch dieser cron-Job legt im Grunde CDs in ein Verzeichnis ab und führt einen Befehl aus. Ich bin sicher, dass launchd eine bessere Möglichkeit bietet, das Verzeichnis anzugeben, in dem der Befehl ausgeführt werden soll.

Woher weiß ich, dass es als root ausgeführt wird und gibt es eine bessere Möglichkeit, dies zu schreiben?

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>dev.project.frontpage.feedparser</string> <key>ProgramArguments</key> <array> <string>cd</string> <string>/Users/eman/src/project/trunk/includes/;</string> <string>./feed-parser.php</string> <string>-c</string> <string>./feed-parser-config.xml</string> </array> <key>QueueDirectories</key> <array/> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>12</integer> <key>Minute</key> <integer>0</integer> </dict> <key>WatchPaths</key> <array/> </dict> </plist> 
30

5 Antworten auf die Frage

46
Chealion

In welchem ​​Ordner wird .plistgespeichert?

launchdführt Daemons ( /Library/LaunchDaemonsoder /System/Library/LaunchDaemons) als root aus und führt sie unabhängig davon aus, ob Benutzer angemeldet sind oder nicht. Startagenten ( /Library/LaunchAgents/oder ~/Library/LaunchAgents/) werden ausgeführt, wenn ein Benutzer als dieser Benutzer angemeldet ist. Sie können setuid nicht verwenden, um den Benutzer zu ändern, der das Skript auf Daemons ausführt.

Da Sie es hinzufügen /Library/LaunchDaemonsmöchten, sollten Sie sicherstellen, dass Sie es launchdmit Administratorrechten laden (z. B. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist).

Schauen Sie sich man launchdfür weitere Informationen.

Vielen Dank. Das war genau das, wonach ich gesucht hatte, um das eigentliche Problem zu beantworten. Das Skript befindet sich in / Library / LaunchDaemons und wurde daher bereits als root ausgeführt. Emmanuel Mwangi vor 14 Jahren 0
Eine neue Frage: Wird `launchctl` für die Installation eines Daemons benötigt? Ich meine, reicht es nicht aus, die plist-Datei in den entsprechenden Pfad zu kopieren? Claudix vor 9 Jahren 0
@Claudix: Das stimmt. Das Kopieren der launchd-Konfiguration an Ort und Stelle reicht nicht aus - Sie müssen sie trotzdem "einschalten" (launchctl load) Chealion vor 9 Jahren 0
4
hanleyp

Haben Sie es mit einem der Launchd-Editoren versucht?

Um sicherzustellen, dass es als root ausgeführt wird, bin ich mir ziemlich sicher, dass launchd die Programme als root ausführen wird. Denken Sie immer daran, mit chmod den Besitz des Skripts an root zu übergeben? Auf diese Weise wird es nur ausgeführt, wenn es als root ausgeführt wird. Sie müssen dann überprüfen, ob es ausgeführt wird.

sudo chown root:admin script_to_run_by_launchd 
Ich habe Lingon benutzt, um dieses Skript zu schreiben. Und ich kann bestätigen, dass es in Leopard gut funktioniert. Emmanuel Mwangi vor 14 Jahren 0
3
user495470

Eigenschaftslisten in LaunchAgents funktionieren auch, aber Sie müssen sowohl Agenten als auch Daemons mit sudo laden:

sudo chown root /Library/LaunchAgents/test.plist sudo launchctl load /Library/LaunchAgents/test.plist 

Wenn die plist keinen deaktivierten Schlüssel hat, wird dieser standardmäßig beim nächsten Anmelden oder Neustart geladen und -wist nicht erforderlich.

Technische Anmerkung TN2083: Daemons und Agenten :

Ein Daemon ist ein Programm, das als Teil des Gesamtsystems im Hintergrund ausgeführt wird (dh es ist nicht an einen bestimmten Benutzer gebunden). Ein Daemon kann keine GUI anzeigen. Insbesondere ist es nicht zulässig, eine Verbindung zum Fensterserver herzustellen.

[...]

Ein Agent ist ein Prozess, der für einen bestimmten Benutzer im Hintergrund ausgeführt wird. Agenten sind nützlich, weil sie Dinge tun können, die Daemons nicht ausführen können, z. B. verlässlicher Zugriff auf das Home-Verzeichnis des Benutzers oder eine Verbindung zum Fensterserver.

3
Cory Klein

Für Googler, die gezielt einen Launch Agent mit Root-Privilegien als Launch Daemon ausführen möchten, können Sie Folgendes tun:

  • Erstellen Sie Ihren LaunchAgent in ~/Library/LaunchAgents
  • Führen Sie Ihre Anwendung mit sudoüber die ProgramArgumentsEigenschaft in Ihrer Liste aus
  • Stellen Sie die NOPASSWDOption für Ihre Anwendung in ein/etc/resolvers.d

Weitere Informationen finden Sie in dieser und in dieser Antwort.

2
Jose Leon

LaunchControl made it painless for me in Yosemite. It has a nice drag-n-drop GUI to help you create or edit services. It was surprising to see all the services running that I did not know about.

Steps

  1. Start LaunchControl
  2. Top-left change to GlobalDeamons and enter your admin password
  3. File->New
  4. Under label, give it a unique name. Convention is "com.company.appname"
  5. Under Program to run use the Unix Shell script or whatever command you prefer WITHOUT arguments
  6. If your app requires arguments the change the dropdown field from "Default argv" to "Custom argv"
    1. now provide the argument you would normal as you would run it from the actual command line.
  7. Run at Load is optional, you decide.
  8. From the right-side, drag and drop StartInterval and set the interval you want. The FAQ under Help menu is very good.
Können Sie Ihren Beitrag bitte so bearbeiten, dass er die Schritte enthält, die der Fragesteller unternehmen kann, um das Problem zu lösen? Cfinley vor 9 Jahren 0