2010-03-08 5 views
5

J'ai un script bash qui exécute un script ruby ​​qui récupère mes flux Twitter.Script exécuté avec succès en ligne de commande, mais pas en tant que cronjob

## /home/username/twittercron 

#!/bin/bash 

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

Il fonctionne en ligne de commande avec succès.

/home/username/twittercron 

Mais lorsque je tente de l'exécuter comme une tâche cron, il a couru, mais n'a pas pu aller chercher les aliments.

## crontab -e 

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

Le script a été chmod + x. Je ne sais pas pourquoi c'est comme ça. Des idées?

Répondre

11

Ruby Version Manager (rvm) était à l'origine du problème. J'ai dû appeler le script en cron comme ça.

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

J'ai essayé de résoudre ce problème depuis environ une semaine maintenant. Merci beaucoup pour cela! –

+0

Vous êtes le bienvenu. – JasonOng

+0

vous pouvez rechercher votre bashrc entier à la place, en supposant qu'il sources rvm. 'source $ HOME/.bashrc && ... – kch

0

Vous devez fournir le chemin absolu à la commande d'exécution (ou via env).

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

Autre possibilité:

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

c'est un script bash qu'il exécute. – ghostdog74

+0

J'ai essayé votre suggestion alternative. Ce n'est toujours pas bon ... – JasonOng

+0

Qu'attendez-vous en conséquence? Est-ce qu'il écrit dans un fichier ou une base de données? Ou attendez-vous simplement que le fichier stdout de crontab vous soit envoyé par courrier électronique? – bojo

0

Vous avez un trop grand nombre * s dans votre crontab.

+0

Désolé, c'était une faute de frappe. J'ai correct non. de * – JasonOng

0

Vérifiez votre courrier et vérifiez s'il y a des messages d'erreur. Mettez un peu de débogage dans votre script bash, par exemple echo done>debug.log à la dernière ligne et voyez si debug.log est créé. Supprimez le ## /home/username/twittercron dans votre script et placez #!/bin/bash sur la première ligne.

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

Au lieu de debug.log, essayez: 'MAILTO = your @ email.addy' (à l'intérieur de la crontab), puis en exécutant'/bin/bash -x/home/username/twittercron' comme commande cron. Cela enverra la trace complète à la fin. –

+0

Mon/var/log/syslog & /var/log/cron.log montre que la commande a été exécutée mais aucune erreur n'a été levée. – JasonOng

1

J'ai eu une bonne expérience en utilisant http://github.com/javan/whenever

Il utilise une connexion DSL Ruby pour gérer les tâches cron et il gère la mise en toute la magie de l'environnement.

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

Je pense que cela peut être fait simplement en forçant bash à agir comme un shell de connexion, il .bashrc Sources de, etc .:

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

Here est un article à ce sujet.

Questions connexes