eseguendo uno script sh dal cron


12

Ho uno script test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

quando eseguo il file come root dalla riga di comando funziona.

sh /home/v/test.sh 

quando l'ho impostato su crontab -e (è il cron cron), non funziona

 * * * * * sh /home/v/test.sh

Cosa faccio di sbagliato? Grazie


"non funziona" non funziona. Vedere? Non sai cosa intendo, e come noi non sappiamo cosa intendi. Voglio dire (sì) cosa non funziona? Potrebbe trattarsi di qualsiasi cosa. Potrebbe essere che la supposizione sia corretta, ma è solo una supposizione (e piuttosto buona penso, ma comunque).
— Jürgen A. Erhard,

Sì, se puoi essere più specifico con quali risultati stai vedendo, saremo in grado di determinare meglio quale sia il problema. Cioè, cosa intendi con "non funzionante" (:
— gabe.

Non vedo alcun registro nel syslog, e gli script stanno facendo degli inserimenti in un db che non stanno accadendo, e loro accaderebbero se eseguissi lo script a mano.
— Elzo Valugi,

Risposte:


15

Secondo l'uomo:

Il demone cron avvia una subshell dalla directory HOME. Se si pianifica l'esecuzione di un comando quando non si è effettuato l'accesso e si desidera eseguire i comandi nel file .profile, il comando deve leggere esplicitamente il file .profile.

Il demone cron fornisce un ambiente predefinito per ogni shell, definendo HOME, LOGNAME, SHELL (= / usr / bin / sh)
e PATH (= / usr / bin).

Quindi il demone cron non sa dove si trova php e dovresti specificare il percorso php completo a mano, ad esempio (non conosco il tuo vero percorso PHP):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Un altro modo è quello di procurarsi il profilo / etc / (o il tuo .profile / .bashrc), per esempio

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Questo è utile se il tuo .bashrc imposta le variabili d'ambiente che ti servono (es. PERCORSO)

MODIFICARE

Una lettura interessante è " Newbie: Intro to cron ", non sottovalutare l'articolo dal titolo (È una lettura per tutti), infatti è ben scritto completo e rispondi perfettamente alla tua domanda:

...
PATH contiene le directory che saranno nel percorso di ricerca di cron, ad esempio se hai un programma "pippo" nella directory / usr / cog / bin, potrebbe valere la pena aggiungere / usr / cog / bin al percorso, poiché ti impedirà di utilizzare il percorso completo per "pippare" ogni volta che vuoi chiamarlo.
...


Bad $ PATH è la causa più comune di script che funzionano a mano, ma non da cron.
— Patrick,

@Patrick Naturalmente è un problema se cron non sa dove si trova php, altrimenti il ​​crontab Elzo funzionerebbe senza problemi, DEVE essere un problema PATH.
— dal

Grazie mille per la tua risposta. Ha funzionato molto facilmente con me !!! .. Grazie mille @mow.
— Vignesh Prajapati,

5

Esistono quattro cause comuni per i comandi che funzionano quando digitato in un terminale ma non da cron, in ordine di comunanza:

  1. Cron fornisce un ambiente limitato, ad esempio un minimo $PATHe altre variabili previste mancanti.
  2. Cron richiama / bin / sh per impostazione predefinita, mentre potresti usare interattivamente un'altra shell.
  3. Cron tratta il carattere% appositamente (viene trasformato in una nuova riga nel comando).
  4. Cron non fornisce un ambiente terminale o grafico.

Se il tuo lavoro produce output, inclusi messaggi di errore, cron ti invia un'email con l'intero output. Assicurati di leggere la posta che ricevi localmente o di inoltrarla a un indirizzo che leggi. Per inoltrare la posta da un account locale a un altro indirizzo, inserisci l'altro indirizzo ~/.forward. Se il lavoro di cron è in esecuzione come utente del sistema ( root, webmaster, ...), assicurarsi che la posta di utente viene reindirizzato a voi (e qualsiasi altra admin); con la maggior parte delle configurazioni di posta, inserisci linee come root: elzoin /etc/aliases.


2

Il demone cron di solito esegue il comando in una shell in cui la variabile d'ambiente PATH è limitata ad alcune impostazioni predefinite del sistema, ad esempio / usr / bin: / bin.

Probabilmente, il tuo phpcomando non è disponibile in / usr / bin o / bin e quindi lo script fallisce quando viene eseguito tramite cron e viene eseguito correttamente quando non lo è.

Cron di solito segnala errori o messaggi di lavoro via e-mail all'utente root (ovvero quando un comando restituisce uno stato di uscita! = 0 o produce output su stdout / stderr) al termine del lavoro.

A seconda del sistema in uso, è necessario impostare la consegna della posta locale per ricevere questi messaggi.

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.