Come posso eseguire un comando launchd come root


32

Ho il seguente comando launchctl come file .plist. È caricato e impostato per essere eseguito una volta al giorno, ma deve essere eseguito come root e non sono sicuro di come verificarlo.

Inoltre, questo cron job fondamentalmente CD in una directory ed esegue un comando. Sono sicuro che launchd ha un modo migliore di specificare la directory in cui dovrebbe eseguire il comando.

Come faccio a sapere se viene eseguito come root ed esiste un modo migliore per scrivere questo?

<?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>

Risposte:


46

In quale cartella è .plistmemorizzata?

launchdesegue Daemon ( /Library/LaunchDaemonso /System/Library/LaunchDaemons) come root e li eseguirà indipendentemente dal fatto che gli utenti abbiano effettuato l'accesso o meno. Gli agenti di avvio ( /Library/LaunchAgents/o ~/Library/LaunchAgents/) vengono eseguiti quando un utente ha effettuato l'accesso come tale utente. Non è possibile utilizzare setuid per modificare l'utente che esegue lo script sui daemon.

Poiché vorrai aggiungerlo in /Library/LaunchDaemons, assicurati di caricarlo launchdcon i privilegi di amministratore (ad es. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Controlla man launchdper ulteriori informazioni.


Grazie. Questo è esattamente quello che stavo cercando per rispondere al problema di root. Lo script è in / Library / LaunchDaemons quindi era già in esecuzione come root.
Emmanuel Mwangi,

Una domanda da principiante: è launchctlnecessario eseguire l' installazione di un demone? Voglio dire, non è abbastanza per copiare il file plist nel percorso corrispondente?
Claudix,

@Claudix: è corretto. Copiare la configurazione di launchd in atto non è abbastanza - devi ancora "accenderlo" (caricamento launchctl)
Chealion

4

Hai provato a utilizzare uno degli editor lanciati?

Per essere sicuro che sia eseguito come root, sono abbastanza sicuro che launchd eseguirà i programmi come root. Hai mai pensato di dare la proprietà dello script alla radice usando chmod? In questo modo, non funzionerà se non eseguito come root. È quindi necessario verificare che funzioni.

sudo chown root:admin script_to_run_by_launchd

Ho usato Lingon per scrivere questa sceneggiatura. E posso confermare che funziona bene in Leopard.
Emmanuel Mwangi,

3

Anche gli elenchi di proprietà in LaunchAgents funzionano, ma devi caricare agenti e demoni con sudo:

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

Se il plist non ha una chiave disabilitata, viene caricata al successivo accesso o riavvia per impostazione predefinita e -wnon è necessaria.

Nota tecnica TN2083: Demoni e agenti :

Un demone è un programma che viene eseguito in background come parte del sistema complessivo (ovvero, non è legato a un determinato utente). Un demone non può visualizzare alcuna GUI; più specificamente, non è consentito connettersi al server di finestre.

[...]

Un agente è un processo che viene eseguito in background per conto di un determinato utente. Gli agenti sono utili perché possono fare cose che i demoni non possono, come accedere in modo affidabile alla home directory dell'utente o connettersi al server di finestre.


3

Per i googler che desiderano eseguire in modo specifico un Launch Agent con privilegi di root all'interno di un Daemon di lancio , è possibile:

  • Crea il tuo LaunchAgent in ~/Library/LaunchAgents
  • Esegui l'applicazione con sudotramite la ProgramArgumentsproprietà nel tuo plist
  • Impostare l' NOPASSWDopzione per l'applicazione in/etc/resolvers.d

Per maggiori dettagli, vedi questa e questa risposta.


2

LaunchControl mi ha reso indolore per me in Yosemite. Ha una bella GUI drag-n-drop per aiutarti a creare o modificare i servizi. È stato sorprendente vedere tutti i servizi in esecuzione che non conoscevo.

passi

  1. Avviare LaunchControl
  2. In alto a sinistra, passa a GlobalDeamons e inserisci la tua password di amministratore
  3. File-> Nuovo
  4. Sotto l'etichetta, dagli un nome univoco. La convenzione è "com.company.appname"
  5. Sotto Programma per eseguire usa lo script Unix Shell o qualunque comando tu preferisca SENZA argomenti
  6. Se la tua app richiede argomenti, modifica il campo a discesa da "Argv predefinito" a "Argv personalizzato"
    1. ora fornisci l'argomento che faresti normalmente come lo avresti eseguito dalla riga di comando effettiva.
  7. Esegui al caricamento è facoltativo, decidi tu.
  8. Dal lato destro, trascina e rilascia StartInterval e imposta l'intervallo desiderato. Le FAQ nel menu Aiuto sono molto buone.

Puoi modificare il tuo post per includere i passaggi che il richiedente può adottare per risolvere il loro problema?
Cfinley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.