LaunchDaemon erstellen

UnixCoon

UnixCoon

Aktives Mitglied
Thread Starter
Dabei seit
07.07.2020
Beiträge
533
Reaktionspunkte
199
Grüßt euch,
ich finde es nimmt mir eine riesige Last von den Schultern, Dinge zu automatisieren, wofür ich nicht mehr Verantwortlich bin.

Ich habe mich vor kurzem mit Launchd mich etwas näher befasst, und würde jetzt gerne einen Shell Skript schreiben der jedes mal ausgeführt wird.

Eine XML Datei habe ich geschrieben und als .plist bei /Library/LaunchDaemons gespeichert.

Der Code

Code:
<!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>com.mycompany.permissionsfix</string>

<key>ProgramArguments</key>

<array>

<string>sh</string>

<string>/Users/Unixhome/Desktop/command.sh</string>

</array>

<key>RunAtLoad</key>

<true/>

<key>StartInterval</key>

<integer>1</integer>

</dict>

</plist>

Diesen Code habe ich dann in Verbindung mit diesem Code gebracht

Bildschirmfoto 2020-09-29 um 14.29.37.png
Bildschirmfoto 2020-09-29 um 14.31.30.png


sudo chown root /Library/LaunchDaemons/command.sh
sudo chgrp wheel /Library/LaunchDaemons/command.sh
sudo launchctl load -w /Library/LaunchDaemons/command.sh

Nach dem gescheiterten Versuch dann noch
sudo chown root /Users/Unixhome/Desktop/command.sh

Was mache ich falsch???
 
Das sh solltest du mit vollem Pfad unter ProgramArguments packen.
Aber warum kein shebang im script selber?

Vielleicht geht say auch nicht unter den Umständen?
 
Das sh solltest du mit vollem Pfad unter ProgramArguments packen.
Aber warum kein shebang im script selber?

Vielleicht geht say auch nicht unter den Umständen?

Korrekt, danke für deine Antwort
Leider Auch versucht, /bin/sh , aus vielen Foren habe ich gelesen, dass auch Sh, bash o.ä alleine funktioniert.
Auch in der Ausführbaren Datei habe ich sowohl es weggelassen als auch !#/bin/sh reingeschrieben, beides hat nicht funktioniert.

Bei Say weiß ich folgendes, es funktioniert als Ausführbare Datei per Drag & Drop direkt im Terminal, es wird ausgeführt wenn man im Terminal sh Datei schreibt. Außerdem wurde es ausgeführt wenn man statt Sh einfach say schreibt dann klappt es auch.
 
Hier muss die plist geladen und nicht das sh Skript selbst.
Hi danke für deine Antwort
Oh mist, habe es dies mal richtig gemacht also
launchctl unload -w /Library/LaunchDaemons/com.mycompany.permissionsfix

launchctl load -w /Library/LaunchDaemons/com.mycompany.permissionsfix

Es will leider nicht funktionieren
 
Bei Say weiß ich folgendes, es funktioniert als Ausführbare Datei per Drag & Drop direkt im Terminal, es wird ausgeführt wenn man im Terminal sh Datei schreibt. Außerdem wurde es ausgeführt wenn man statt Sh einfach say schreibt dann klappt es auch.

Davon kannst du nicht ausgehen, weil es nicht das gleiche Shell env ist, wenn es launchd oder do shell script ist.

Das Startinterval kannst ja mal zum testen weg lassen.
 
Ich würde gerne nochmal auf dieses Thema eingehen, mittlerweile ist dieser Fall geklärt, nur würde ich gerne Anfänger eine Unterstützung bieten um nicht die selben Fehler, für die ich jede Menge an Zeit investiert habe, auch zu erleben.
Meine Intension war ein schematischer LaunchDaemon, der nach bestimmten Zeiten eine Handlung ausführen soll um mir das Leben an einigen Stellen zu erleichtern.

Anfangs hatte ich echt Schwierigkeiten die Probleme bzw. die Ursachen der Probleme zu sehen, wieso launchd mit diesem Skript nicht klar kommt.


Ich kontrollierte, ob launchd dem Dameon ein timeout gab, das konnte ich anhand tail -f /var/log/system.log festellen.

tail zeigt den Inhalt an. Der Parameter "-f" sagt tail, dass es nicht nur den Inhalt anzeigen soll, sondern kontinuierlich warten soll, ob andere Ereignisse passieren.

Sobald das Skript auftaucht, hat launchd Probleme damit, diese Probleme festzustellen waren Anfangs wirklich aufwendig, oftmals haben viele Möglichkeiten nichts gebracht, was ich also gemacht habe...

Code:
    <key>StandardOutPath</key>
    <string>/var/log/sayhelloOUT.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/sayhelloERROR.log</string>

Mithilfe dieser Option konnte ich die Fehler und die Ausgabe ansehen

Bei Out kam die Ausgabe vom Skript, bei Error kam die launchd Fehlermeldung.

Ich habe die ausführbare Datei in /Users/$(whoami)/Documents gesichert, Daemone sind trotz Systemweit aktiv und haben im eigenen Homeverzeichnis nicht zu suchen, in der Ausgabe des Error Logs stand "Operation not permitted"

Die ausführbare Datei muss man dort hintuen, wo andere Benutzer auch zugreifen können wie z.B /opt /usr/local/bin /Library

Die Plist Datei kann man mit plutil überprüfen....

Zudem waren Shebang also #/bin/bash völlig obsolet, da Launchd es nicht ohne Hilfe startet sondern mit /bin/bash

Außerdem sollte man sich möglichst schützen vor Trojaner Skripten, am besten immer den ganzen Pfad eingeben (mit which sudo überprüfbar) /usr/bin/sudo /bin/bash /bin/sh
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dg2rbf
Zudem waren Shebang also #/bin/bash völlig obsolet, da Launchd es nicht ohne Hilfe startet sondern mit /bin/bash
... das ist nur desswegen so bei dir, da du das Script mit einem expilziten Aufruf der Shell startest, was überhaupt nicht erforderlich ist. Dafür wurde ja gerade der shebang erfunden. Fazit: /bin/sh aus der plist der ProgramArguments entfernen und #!/bin/sh in das script.
 
  • Gefällt mir
Reaktionen: dg2rbf
Zurück
Oben Unten