Impossibile avviare il demone con launchctl in Yosemite


27

Ho inserito un demone launchd ~/Library/LaunchAgentsche ha funzionato bene in Mavericks. Ma non inizierà nella beta pubblica di Yosemite. Il demone plist è così (il mio nome utente è darksaircon UID 501)

<?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.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Fondamentalmente dovrebbe funzionare ~/bin/retrmail.pyogni 5 minuti.

Ho notato che in Yosemite launchd è aggiornato alla 2.0 e launchctl ha nuovi comandi. Provai

sudo launchctl kickstart user/501/org.darksair.retrmail

e diceva

Could not find service "org.darksair.retrmail" in domain for uid: 501

Ho anche provato la vecchia scuola

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

e diceva

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

Il file appartiene a me e al gruppo del personale. Ho provato sia l'autorizzazione 644 che 600 con lo stesso errore.

Quindi qualcuno sa come avviare correttamente un demone launchd in Yosemite?


AGGIORNAMENTO: sembra che il mio file dell'agente di avvio debba essere di proprietà di root:wheel. Dopo chown, ho provato

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

e non ha emesso alcun errore. E penso che il mio deamon stia funzionando correttamente. Lascerò aperta questa domanda perché ricordo che il documento launchd afferma chiaramente che il file dell'agente di avvio può essere di proprietà dell'utente che esegue il daemon.


AGGIORNAMENTO2: No, non funzionava correttamente. È stato eseguito solo una volta, ma non di nuovo, come se fosse scaricato.


AGGIORNAMENTO3: ho eseguito l'upgrade a Yosemite public beta 3 e ho cambiato il mio agente in questo

<?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.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Ho ricaricato questo agente e penso che ora funzioni correttamente. Lascio ancora aperta questa domanda perché non so cosa c'è che non va nel mio precedente plist.


In conclusione, quello che ho scoperto è che devo cambiare il proprietario del plist root:wheelper caricarlo.


Funziona in Yosemite final?
TJ Luoma,

@TJLuoma: si. Finché il plist è di proprietà di root: wheel.
MetroWind

Risposte:


21

A partire dal man launchctl

Si noti che i file di configurazione per utente (LaunchAgents) devono essere di proprietà di root (se si trovano in / Library / LaunchAgents) o dell'utente che li carica (se si trovano in $ HOME / Library / LaunchAgents). Tutti i daemon a livello di sistema (LaunchDaemons) devono essere di proprietà di root. I file di configurazione devono impedire le scritture di gruppo e del mondo. Queste restrizioni sono in vigore per motivi di sicurezza, in quanto la possibilità di scrivere su un file di configurazione launchd consente di specificare quale eseguibile verrà avviato.

La correzione è

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
"Oppure l'utente li sta caricando" <- Questa è la parte con cui ho problemi.
MetroWind

2
Non sono un ragazzo unix, ma dice "non consentire il gruppo e il mondo scrive". Dal momento che potrebbe ancora aver bisogno di essere letto, non dovrebbe essere chmod 644?
Jason,

5

Stranamente, l'utilizzo sudoera il tuo problema. Usando sudo, non eri più te stesso, quindi non eri il proprietario del tuo file. Rimuovi sudo, ripeti il ​​comando e dovrebbe caricarsi bene. Ci scusiamo per l'approccio filosofico a tutto questo.


4

Ho trovato la soluzione

Il comando corretto in questo caso è

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

E per scaricare,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Non so perché sia launchctl loadnecessario il root, ma caricare / scaricare è comunque deprecato.


La pagina man elenca l'avvio non il bootcut. Penso che la correzione automatica ti abbia dato che sulla mia macchina cambia l'avvio in bootcut.
Steve Moser,

@MetroWind Ricevo Impossibile trovare il dominio per l'errore Code = 112 con il comando sopra. non è coerente. qualche indizio?
Parag Bafna,

Hai ancora bisogno del chmod& chown?
Itachi, il

@Itachi, no. Lasciare il proprietario e l'autorizzazione predefiniti dovrebbe andare bene.
MetroWind

@ParagBafna, non ne sono sicuro. Forse il tuo UID non è 501?
MetroWind

3

Mi sono imbattuto anche in questo, cercando di usare l'utente, non .plist di proprietà root (come si dovrebbe essere in grado di fare)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

Sono stato collegato a questa macchina in remoto mentre NON ero loggato dalla console (senza testa) che sembrava essere il mio problema - almeno i servizi gestiti dall'utente hanno bisogno che l'utente abbia effettuato l'accesso nella schermata principale (ho finito per farlo accesso tramite gestione remota poiché si tratta di una macchina senza testa)

IMO, se vuoi che funzioni anche se non sei personalmente lì per accedere, le tue opzioni sono:

  • Effettua l'accesso automatico al tuo account (annota le implicazioni di sicurezza, anche senza il tag UserName come indicato in una delle risposte)

  • Rendi i file root di proprietà come indicato nei vari suggerimenti (impostando l'utente come nuovo su UserName come hai già fatto)


2
Grazie mille. Ho trovato una soluzione nella tua risposta.
Retraut

2

Ecco un'idea sciocca.

Ho avuto lo stesso errore, anche dopo aver effettuato l'aggiornamento a Yosemite. Ho erroneamente supposto che significasse cattiva proprietà / permessi sul file .plist, quando in effetti, per qualche ragione, il binario a cui mi riferivo nel plist (nel mio caso cassandra), aveva perso il suo bit eseguibile.

chmod + x'ing lo ha riparato.

Probabilmente non è un tuo problema, ma potrebbe valere la pena provare :)


Questo non si applica al mio caso però. Il mio eseguibile ha il bit di autorizzazione x. Ma grazie comunque per la risposta. Spero che possa aiutare altre persone.
MetroWind,

2

Rimuovere la UserNamechiave e la stringa.

Il problema è che la UserNamechiave può essere utilizzata solo se il processo è avviato da root. Può essere avviato come root solo se il plist è di proprietà di root. Fondamentalmente, il processo viene avviato da root e quindi viene richiesto all'utente specificato. Se vuoi che questo processo funzioni come te stesso, metti il ​​plist nella cartella ~ / Library / LaunchAgents e rimuovi la chiave UserName.


Funziona dopo aver rimosso l'opzione 'UserName' per zabbix_agend. Grazie! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

Strano ... Non si caricherà ancora dopo aver rimosso la cosa "UserName" ...
MetroWind

1

Stavi tentando di ricaricare manualmente un agente con autorizzazioni utente? Non capisco del tutto il motivo per cui è richiesto tutto ciò, ma credo che tu debba essere collegato al dominio del tuo utente (al quale sembra che tu non sia collegato quando corri come root). L'uso di queste funzioni per ricollegarsi ha funzionato per me.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Lo useresti come segue:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Bsexec ti rimette nel tuo dominio e ti consente di aggiungere l'attività come utente di lancio.


Dice: /Users/darksair/Library/LaunchAgents/retrmail.plist: operazione già in corso. A questo punto le mie domande sono sostanzialmente: perché il comando kickstart non ha funzionato? E perché devo impostare la proprietà plist su root ...?
MetroWind,

1
NON devi impostare il proprietario del tuo file plist come root; tutto in ~ / Library / LaunchAgents dovrebbe essere di proprietà dell'utente a cui appartiene quella directory. Ho ottenuto l'operazione già in corso quando non ho scaricato il comando prima di caricarlo. Stai utilizzando la funzione che ti ho fornito?
imalison,

Sì. Stavo usando le tue funzioni. E prima ho scaricato il plist ...
MetroWind,

Ho appena provato a caricare il primo plist che hai fornito e ha funzionato per me. Quali autorizzazioni sono impostate per il file?
Imalison,

Questo è un incredibile pezzo di codice per tante cose. Sto usando una combinazione di burattini e script bash personalizzati per gestire molti dispositivi macOS diversi e problemi casuali perché la sessione di controllo della sicurezza o il dominio dell'utente non sono corretti sono così comuni. Ottimo lavoro!
Andrew White,
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.