Domanda:
Shell predefinita per il problema di cron
cupakob
2012-10-10 13:02:53 UTC
view on stackexchange narkive permalink

Ho alcuni comandi, funzionano sotto bash, ma non come cronjob. Per vedere quale sia la causa del problema, sto salvando l'output in un file, qui il mio esempio:

  51 * * * * source ~ / .rvm / scripts / rvm >> stack.log 2>&1  

Il contenuto del file di registro è:

  / bin / sh: 1: source: non trovato  

Ciò significa che cron sta usando sh insead di bash . Ho provato a cambiarlo in /etc/crontab:

SHELL=/bin/bash

Ma questo non funziona. Ho guardato in / etc / passwd e qui vedo che il demone usa sh come shell predefinita. Sia root che pi hanno bash come shell predefinita.

  root: x: 0: 0: root : / root: / bin / bashdaemon: x: 1: 1: daemon: / usr / sbin: / bin / shpi: x: 1000: 1000: ,,,: / home / pi: / bin / bash  

Cosa devo fare per cambiare la shell predefinita per cron? Non imposterei / bin / bash per l'utente demone in / etc / passwd ... imho questa non è una buona idea.

edit”:

  ls -l / bin / shlrwxrwxrwx 1 root root 4 mar 30 2012 / bin / sh -> dash  

qui il contenuto di /etc/crontab:

  # / etc / crontab: crontab a livello di sistema # A differenza di qualsiasi altro crontab non devi eseguire il comando `crontab '# per installare la nuova versione quando modifichi questo file # e i file in /etc/cron.d. Questi file hanno anche campi nome utente, # che nessuno degli altri crontab ha SHELL = / bin / bashPATH = / usr / local / sbin: / usr / local / bin: / sbin: / bin: / usr / sbin: / usr / bin # mh dom mon dow user command17 * * * * root cd / && run-parts --report /etc/cron.hourly25 6 * * * root test -x / usr / sbin / anacron || (cd / && run-parts --report /etc/cron.daily)
47 6 * * 7 root test -x / usr / sbin / anacron || (cd / && run-parts --report /etc/cron.weekly) 52 6 1 * * root test -x / usr / sbin / anacron || (cd / && run-parts --report /etc/cron.monthly) #  
Perché vuoi "fonte" nell'ambiente crons? La semplice esecuzione di `~ / .rvm / scripts / rvm` non funziona? E _puoi_ avere problemi con l'utilizzo di ~ in ambienti non bash.
Quattro risposte:
#1
+4
Krzysztof Adamski
2012-10-10 13:07:33 UTC
view on stackexchange narkive permalink

La maggior parte di questi casi (in cui lo script funziona nella shell ma non in cron) è dovuta a variabili di ambiente che sono diverse nello script. In molti casi il problema è la variabile PATH . È possibile utilizzare percorsi completi per tutti gli eseguibili in esecuzione nello script o modificare PATH nella prima riga dello script.

Per tracciare tali problemi, è possibile iniziare dal dumping delle variabili di ambiente disponibili al tuo script utilizzando il comando env , in questo modo: / usr / bin / env> /tmp/env.txt

non ho variabili d'ambiente nel mio script ... e / bin / env non esiste.
No, hai _sempre_ alcune variabili di ambiente in ogni shell. Un esempio è "PATH" che è stato già menzionato. Prova invece `/ usr / bin / env`. Oppure usa `which env` per controllare qual è il tuo percorso completo per` env` util.
#2
+4
Alex Chamberlain
2012-10-10 13:12:14 UTC
view on stackexchange narkive permalink

La shell utilizzata è trattino ; una shell conforme a POSIX, progettata per essere molto più piccola e più stabile di bash.

Si potrebbe sostenere che dovresti scrivere lavori cron essere conforme a POSIX. In alternativa, prova a incapsulare la tua logica in uno script e anteporre lo shebang

  #! / Usr / bin / env bash  
perché #! / usr / bin / env bash e non #! / bin / bash? qual è la differenza?
IMHO non molto. A rigor di termini, consente di archiviare `bash` altrove. Chi lo farebbe, non lo so!
ho provato anche questo ... ho uno script bash wrapper, che chiama il mio comando, ma anche questo non funziona. Ma sto vagando, perché le modifiche in / etc / crontab non fanno il passaggio a bash.
@cupakob Puoi incollare l'intero `/ etc / crontab` per favore?
lo puoi trovare nel mio post
Penso che il problema sia che "source" è un builtin, che non ha senso funzionare da solo.
[continuiamo la discussione in chat] (http://chat.stackexchange.com/rooms/6073/discussion-between-cupakob-and-alex-chamberlain)
#3
+3
Avio
2012-10-10 15:48:16 UTC
view on stackexchange narkive permalink

Sei sicuro che sourcing il tuo script in cron sia assolutamente quello che vuoi fare e, cosa più importante, necessario? Penso che sia quasi sempre una cattiva idea.

Inoltre, quando stai modificando cron (così come altri strumenti che possono essere eventualmente lanciati da altri utenti e / o altre shell), prova a fare un passo -approccio graduale. Ad esempio, puoi testare il tuo ambiente con qualcosa del genere:

  42 * * * * bash -c "echo home --- $ HOME ---" >> / tmp / cron-temp .log 2>&142 * * * * bash -c "echo shell --- $ SHELL ---" >> /tmp/cron-temp.log 2>&1  

o anche:

  42 * * * * bash -c "export" >> /tmp/cron-temp.log 2>&1  

Così puoi avere la prova del tuo ambiente, ecc.

Per rispondere alla tua domanda, non cambierei la shell per cron . Gli direi semplicemente di chiamare bash e poi lasciare che bash chiami i tuoi script.

$ SHELL era ancora "sh" nonostante io l'ho cambiato in / etc / crontab
Sì, è anche l'impostazione predefinita nel mio `cron`. Come ho detto, non lo cambierei. Basta chiamare il tuo script tramite `bash` con` bash -c "yourscript" `e tutto dovrebbe andare bene (non creare il tuo script, probabilmente non ne hai bisogno!)
sì, funzionerà, ma voglio sapere perché la shell predefinita non è stata modificata.
#4
+3
cupakob
2012-10-11 02:27:09 UTC
view on stackexchange narkive permalink

Quindi ... ho due soluzioni per il mio problema:

  1. Script wrapper sul comando bash, che al momento sto chiamando come cronjob. Il problema qui: per ogni cronjob ho bisogno di un wrapper, e questa non è la soluzione migliore per me.

  2. Ho provato a chiamare uno script ruby ​​come cronjob. Questo non funziona, quindi ho pensato, devo chiamare 'rvm use 1.9.3' e per questo devo prima chiamare 'source ~ / .rvm / scripts / rvm'. E qui è stato il mio errore. Nella mia istanza di bash ho il percorso per ruby, ma non come cron. Dopo aver risolto questo problema, tutto funziona correttamente e posso eseguire i miei script Ruby come cronjob.

Alex Chamberlain mi ha aiutato molto e mi ha dato i suggerimenti più importanti . Grazie mille per l'aiuto !!!



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...