Kann launchd dazu gebracht werden, einen anderen Besitzer für Dateien festzulegen, die es während der Ausführung eines .plist-Jobs erstellt?

Ich habe eine launchctl .plist-Datei in /Library/LaunchDaemons wie folgt:

<?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>david.ports.slocate.home.updatedb</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/local/bin/slocate</string>
        <string>-U</string>
        <string>/Users/david</string>
        <string>-o</string>
        <string>/Users/david/slocate_david.db</string>
    </array>
    <key>Umask</key>
    <string>077</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>5</integer>
        <key>Minute</key>
        <integer>45</integer>
    </dict>
</dict>
</plist>

Für diejenigen, die sich fragen, verwende ich den slocate-Port von MacPorts anstelle der nativen locate-Datenbank, die mit OS X geliefert wird. Dieser .plist-Job aktualisiert täglich um 5:45 Uhr die slocate-Datenbank, die für mein Home-Verzeichnis spezifisch ist. Die Umask-Einstellung von 077 macht die Ausgabedatei nur für mich lesbar. Die Datei wird jedoch mit dem Besitz von root erstellt; nicht was ich will.

Gibt es eine Möglichkeit, den Besitz der Ausgabedatei anstelle der Standardeinstellung von root anzugeben? Mir ist klar, dass ich dies als LaunchAgent unter ~/Library/LaunchAgents ausführen kann, aber ich bevorzuge, dass der Job ausgeführt wird, ob ich angemeldet bin oder nicht, und installiere ihn daher als LaunchDaemon.

Ich verwende OS X 10.10.3 Yosemite.

Antworten (2)

Ich habe ein paar Vorschläge. Laut Handbuch können Sie den UserName-Schlüssel https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html festlegen . Sie könnten periodic mit einem Shell-Skript verwenden, um slocate auszuführen und die Berechtigungen der Datenbank zu ändern. Richten Sie eine Benutzer-Crontab ein. Eine Benutzer-Crontab wird nur zur angegebenen Zeit ausgeführt.

Das Festlegen des Schlüssels UserName hat das Problem behoben. Ich kann nicht glauben, dass ich das nicht gesehen habe oder dass es mir nicht eingefallen ist. Ich habe nach Chown gesucht, als ich nach einem Prozessverantwortlichen hätte suchen können. Danke schön. Ich habe dies als richtige Antwort festgelegt. Werde dich positiv bewerten, wenn ich genug Ansehen habe.
jemand der sich mit dem thema gut auskennt :) ein + von mir

Anstatt /Library/LaunchDaemonsden Benutzer basierend ~/Library/LaunchAgentsauf Ihrer Benutzerbibliothek zu verwenden. Dann wird der Prozess als angemeldeter Benutzer statt als Root-Konto ausgeführt.

Ich ziehe es vor, dass der Job ausgeführt wird, ob ich angemeldet bin oder nicht. Ich denke, da LaunchDaemons als Root ausgeführt werden, können sie den Eigentümer der von ihnen erstellten Dateien ändern. Wenn dies nicht der Fall ist, werde ich wahrscheinlich stattdessen einen anderen LaunchDaemon erstellen, um den Besitz dieser Datei zu ändern und ihn gut laufen zu lassen, nachdem der vorherige abgeschlossen ist. Ich wünschte, es gäbe eine elegantere Lösung als diese. Danke für die Antwort.
Nein, die Strategie in meinem vorherigen Kommentar wird nicht funktionieren, da beide Jobs ausgeführt werden, wenn der Computer nach der geplanten Laufzeit hochfährt oder aufwacht. Stattdessen werde ich beim zweiten Job StartInterval 300 oder so verwenden, um diese Datei einfach alle 5 Minuten zu chownen. Immer noch unelegant.