Wie ändere ich einen Launch Daemon dauerhaft unter OS X El Capitan?

Ich habe die standardmäßige org.postfix.master.plist von postfix so geändert, dass sie als Daemon läuft , sodass sie mir eine E-Mail senden kann, wenn ein lokaler Benutzer eine E-Mail erhält.

Standard:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.postfix.master</string>
    <key>Program</key>
    <string>/usr/libexec/postfix/master</string>
    <key>ProgramArguments</key>
    <array>
        <string>master</string>
        <string>-e</string>
        <string>60</string>
    </array>
    <key>QueueDirectories</key>
    <array>
        <string>/var/spool/postfix/maildrop</string>
    </array>
    <key>AbandonProcessGroup</key>
    <true/>
</dict>
</plist>

Geändert:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>org.postfix.master</string>
        <key>Program</key>
        <string>/usr/libexec/postfix/master</string>
        <key>ProgramArguments</key>
        <array>
                <string>master</string>
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/var/spool/postfix/maildrop</string>
        </array>
        <key>AbandonProcessGroup</key>
        <true/>
</dict>
</plist>

Diese Datei ist jedoch unter /System/Library/LaunchDaemons/, also musste ich SIP vorübergehend deaktivieren, um die Datei zu ändern. Ich habe gelesen, dass nach dem nächsten OS-Update alle meine Änderungen wegen SIP weg sein werden. Was kann ich tun, damit das dauerhaft wird? Kann ich meinen Launch Daemon /Library/LaunchDaemonsals zweiten unterstellen?

Antworten (2)

Ich musste mich noch nicht "wirklich" damit befassen, aber ich denke, die beste Lösung ist:

  1. Kopieren Sie die .plist-Datei nach /Library/LaunchDaemons.
  2. Benennen Sie es um (z. B. indem Sie „local.“ am Anfang des Dateinamens hinzufügen) und passen Sie seinen LabelWert entsprechend an. Wenn Sie dies nicht ändern, wird launchd wahrscheinlich zwischen diesem und dem Original verwechselt.
  3. Nehmen Sie alle anderen Änderungen vor, die Sie benötigen
  4. Stellen Sie sicher, dass der Besitz auf root:wheel und die Berechtigungen auf 644 eingestellt sind.
  5. Deaktivieren Sie das ursprüngliche Element mit zB sudo launchctl unload -w /System/Library/LaunchDaemons/org.postfix.master.plist(das -wmacht es dauerhaft).
  6. Laden Sie Ihren angepassten Ersatz mit eg sudo launchctl load /Library/LaunchDaemons/local.org.postfix.master.plist(oder starten Sie einfach neu).

Übrigens, wenn Sie SIP einfach deaktivieren und die vorhandene Datei ändern, wird sie nicht unbedingt durch ein Betriebssystem-Update zurückgesetzt. Aber es könnte sein , und Sie müssten nach jedem Update (einschließlich Sicherheitsupdates usw.) nachsehen, was mühsam ist.

Deine Lösung funktioniert. Das Ändern des LabelWerts ist in der Tat wichtig. Andernfalls startet der Daemon nicht.

Ich hatte ein ähnliches Problem, und das oben Gesagte hat es für mich nicht behoben. Ich teile mein Mitnehmen, wenn es jemals jemandem etwas Zeit sparen kann (ich habe ein paar Stunden damit gekämpft)

Tldr: Ich musste meine plist als root ausführen


In meinem Fall wurde die plist korrekt vom Terminal geladen:

sudo launchctl load /Library/LaunchAgents/com.name.of.the.plist

Aber nach Neustart des Rechners nicht mehr. Übrigens können Sie überprüfen, ob Ihre Plist mit Folgendem geladen ist:

sudo launchctl list | grep "my.plist"

Ich habe genau den Fehler beim Hinzufügen von Protokollen gesehen:

<key>StandardErrorPath</key>
<string>/Users/XXX/err.log</string>
<key>StandardOutPath</key>
<string>/Users/XXX/out.log</string>

Es zeigte sich diese Fehlermeldung:

sysadminctl[807:9587] sysadminctl should be run as root, or in interactive mode!

Ich dachte wirklich, mein Skript wurde bereits als root ausgeführt (weil ich in war /Library/LaunchAgents/), aber das war nicht der Fall, und mein Skript bekam ein Berechtigungsproblem!

Nun, um die plist als root auszuführen:

  • Verschieben Sie die Liste von /Library/LaunchAgents/nach/Library/LaunchDaemons/
  • Fügen Sie den UserNameSchlüssel wie folgt hinzu:
<key>UserName</key>
<string>root</string>

In meinem Fall hat es gut funktioniert!