2010-03-08 15 views
5

Ho uno script di bash che esegue uno script ruby ​​che recupera i miei feed di Twitter.Script viene eseguito correttamente in commandline ma non come cronjob

## /home/username/twittercron 

#!/bin/bash 

cd /home/username/twitter 
ruby twitter.rb friends 

Viene eseguito con successo nella linea di comando.

/home/username/twittercron 

Ma quando provo a farlo funzionare come un cronjob, ha funzionato ma non è stato in grado di recuperare i feed.

## crontab -e 

*/15 * * * * * /home/username/twittercron 

Lo script è stato chmod + x. Non sono sicuro del perché sia ​​così. Qualche idea?

risposta

11

Ruby Version Manager (rvm) stava causando il problema. Ho dovuto chiamare lo script in cron come questo.

*/15 * * * * bash -c 'source /home/username/.rvm/scripts/rvm && /usr/bin/env ruby /home/username/twitter/twitter.rb friends' 
+0

Ho cercato di risolvere questo problema per circa una settimana. Grazie mille per questo! –

+0

Sei il benvenuto. – JasonOng

+0

è possibile invece l'origine dell'intera bashrc, assumendo che provenga da rvm. 'source $ HOME/.bashrc && ...' – kch

0

È necessario fornire il percorso assoluto al comando di esecuzione (o tramite env).

*/15 * * * * * /usr/bin/env sh /home/username/twittercron 

alternativa:

*/15 * * * * * /usr/bin/env ruby /home/username/twitter/twitter.rb friends 
+1

questo è uno script di bash che sta eseguendo. – ghostdog74

+0

Ho provato il tuo suggerimento alternativo. Non va ancora bene ... – JasonOng

+0

Cosa ti aspetti di conseguenza? Scrive su un file o database? O stai solo aspettando che lo stdout di crontab ti venga inviato per posta? – bojo

0

Hai uno troppe * s nel vostro crontab.

+0

Mi dispiace che sia stato un refuso. Ho corretto no di * s. – JasonOng

0

controlla la posta e controlla se ci sono messaggi di errore. Metti un po 'di debug nel tuo script bash, ad esempio echo done>debug.log nell'ultima riga e verifica se è stato creato lo debug.log. rimuovere lo ## /home/username/twittercron nello script e inserire #!/bin/bash sulla prima riga.

*/15 * * * * * /bin/bash /home/username/twittercron 
+0

Invece di debug.log, prova: 'MAILTO = your @ email.addy' (all'interno di crontab), quindi esegui'/bin/bash -x/home/username/twittercron' come comando cron. Questo invierà per email la traccia completa alla fine. –

+0

Il mio/var/log/syslog e /var/log/cron.log mostrano che il comando è stato eseguito ma nessun errore è stato generato. – JasonOng

1

Ho avuto una buona esperienza con http://github.com/javan/whenever

Esso utilizza un modem DSL Ruby per gestire le attività cron e gestisce l'impostazione tutta la magia dell'ambiente.

every 3.hours do 
    runner "MyModel.some_process" 
    rake "my:rake:task" 
    command "/usr/bin/my_great_command" 
end 
9

Penso che può essere fatto semplicemente forzando ad agire bash come shell di login, quindi sources .bashrc, ecc .:

*/15 * * * * * /bin/bash -l -c '/home/username/twittercron' 

Here è un articolo su questo.

Problemi correlati