2015-12-11 13 views
18

Voglio eseguire un servizio di sincronizzazione unison in esecuzione in background ogni volta che accedo. Ma il codice di stato del mio agente è 78. Non so perché, ho provato qualche correzione pubblicata online, ma semplicemente non funziona.cosa significa launchd status 78 ?? perché il mio agente utente non è in esecuzione ??

Qual è il problema ?? sotto è il file plist per il mio servizio.

<?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>syncmyproject</string> 
    <key>StandardOutPath</key> 
    <string>/var/log/syncmyproject.log</string> 
    <key>StandardErrorPath</key> 
    <string>/var/log/syncmyproject.log</string> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>KeepAlive</key> 
    <true/> 
    <key>Debug</key> 
    <true/> 
    <key>EnableGlobbing</key> 
    <true/> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/usr/local/bin/unison</string> 
     <string>-auto</string> 
     <string>-batch</string> 
     <string>-repeat watch</string> 
     <string>~/home/project</string> 
     <string>~/project</string> 
    </array> 
</dict> 
</plist> 
+0

Puoi 'grep' questo file per possibili indizi su cosa non va:'/var/log/system.log' – Nick

risposta

22

ho letto man launchctl, trovare 78 mezzi function not implemented. Non aiuta molto.

Infine ho farlo funzionare, in realtà ci sono stati errori nel plist, vi consiglio di installare il brew cask install launchcontrol, che è uno strumento GUI per launchctl, può contribuire a rilevare gli errori e la risoluzione dei problemi.

+3

Grazie per questo. launchcontrol ha aiutato a risolvere il mio problema. Per la cronaca avevo lo status 78 e il mio problema era che il mio copione non iniziava con un interprete e, g; '#!/bin/sh' – gooddadmike

+1

Per me il problema era che la directory dei log non era accessibile all'utente corrente. – d4Rk

+0

sì, anche a me. Ho avuto un errore nello shebang. Ciò ha reso difficile il debug poiché la sceneggiatura veniva eseguita in modo impeccabile quando l'ho eseguita, ma non quando launchd ha cercato di eseguirla. – wetjosh

0

Ho ricevuto questo errore durante il tentativo di eseguire mono per avviare un server web locale. Risulta che la soluzione era quella di non usare il percorso mono dato da "quale mono" (che è un link simbolico: /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono) ma la posizione effettiva dell'exe (nel mio caso /Library/Frameworks/Mono.framework/Commands/mono).

5

[Ran in questo problema e, quindi documentare ciò che ho trovato]

"78" è l'ultimo codice di uscita del lavoro che si sta eseguendo. Da man launchctl:

Senza argomenti, elencare tutti i processi caricati in launchd in tre colonne. La prima colonna visualizza il PID del lavoro se viene eseguito - ning. La seconda colonna visualizza l'ultimo stato di uscita del lavoro. Se il numero in questa colonna è negativo, rappresenta il negativo di il segnale che ha interrotto il lavoro. Pertanto, "-15" indica che il lavoro è stato terminato con SIGTERM. La terza colonna è l'etichetta del lavoro. Se si specifica [etichetta], stampa le informazioni sul lavoro richiesto.

I.e. devi leggere la documentazione (o il codice sorgente) per qualsiasi lavoro tu stia iniziando. (Nel mio caso, mysqld)

Vale la pena notare che "78" è menzionato come standard exit code su Linux, indicando un errore di configurazione. Quindi dai un'occhiata alla configurazione del tuo lavoro (e ai log degli errori?) Per vedere se hai qualcosa di mal configurato.

+0

nel mio caso mi ero dimenticato di chmod + x lo script di shell ':) – eddyce

0

Ho trovato che l'errore aveva a che fare con le autorizzazioni. Stavo cercando di reindirizzare gli errori e i registri nella directory/var/log (su cui il mio utente non è in grado di scrivere!) cambiando il percorso verso qualcosa in cui il mio utente aveva le corrette autorizzazioni risolte.

Fare attenzione quando si caricano i propri LaunchAgent. Non utilizzare sudo per caricare un plist se si è nella directory ~/Library/LaunchAgents.

1

Ecco cosa mi ha sorpreso: in Mac OS X puoi eseguire script di shell da riga di comando anche se nel file c'è solo "lo script". Tuttavia, quando li esegui da launchd devi dire quale binario deve eseguire lo script. Supponiamo che quando si esegue da riga di comando si usi solo la shell in cui ci si trova attualmente (nel mio caso bash), ma quando si esegue da launchd non esiste "script circostante". Ho aggiunto

#!/bin/sh 

come prima riga nel file di script, e poi ha funzionato.