exécution d'un script sh à partir du cron

12

J'ai un script test.sh

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

lorsque j'exécute le fichier en tant que root à partir de la ligne de commande, cela fonctionne.

sh /home/v/test.sh 

quand je le mets à crontab -e (est le cron racine), ne fonctionne pas

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

Qu'est-ce que je fais mal? Merci

Elzo Valugi
la source
"ne fonctionne pas" ne fonctionne pas. Voir? Vous ne savez pas ce que je veux dire, et comme nous ne savons pas ce que vous voulez dire. Je veux dire (oui) qu'est - ce qui ne fonctionne pas? Cela pourrait concerner n'importe quoi. Peut-être que la supposition de tmow est correcte, mais ce n'est qu'une supposition (et assez bonne je pense, mais quand même).
Jürgen A. Erhard
Oui, si vous pouvez être plus précis avec les résultats que vous voyez, nous serons mieux en mesure de déterminer quel est le problème. C'est-à-dire, que voulez-vous dire par "ne pas travailler" (:
gabe.
Je ne vois aucun journal dans le syslog, et les scripts font des insertions dans une base de données qui ne se produisent pas, et ils se produisent si j'exécute le script à la main.
Elzo Valugi

Réponses:

15

Selon l'homme:

Le démon cron démarre un sous-shell à partir de votre répertoire HOME. Si vous planifiez l'exécution d'une commande lorsque vous n'êtes pas connecté et que vous souhaitez exécuter les commandes de votre fichier .profile, la commande doit lire explicitement votre fichier .profile.

Le démon cron fournit un environnement par défaut pour chaque shell, définissant HOME, LOGNAME, SHELL (= / usr / bin / sh)
et PATH (= / usr / bin).

Donc, le démon cron ne sait pas où est php et vous devez spécifier le chemin php complet à la main, par exemple (je ne connais pas votre vrai chemin PHP):

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

Une autre façon est de trouver le profil / etc / (ou votre .profile / .bashrc), par exemple

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

Ceci est utile si votre .bashrc définit les variables d'environnement dont vous avez besoin (par exemple PATH)

ÉDITER

Une lecture intéressante est " Newbie: Intro to cron ", ne sous-estimez pas l'article du titre (c'est une lecture pour tout le monde), en fait c'est bien écrit complet et répond parfaitement à votre question:

...
PATH contient les répertoires qui se trouveront dans le chemin de recherche de cron. Par exemple, si vous avez un programme 'foo' dans le répertoire / usr / cog / bin, il pourrait être utile d'ajouter / usr / cog / bin au chemin, car cela vous évitera d'avoir à utiliser le chemin complet de "foo" chaque fois que vous voulez l'appeler.
...

tmow
la source
Bad $ PATH est la cause la plus courante des scripts qui fonctionnent à la main, mais pas à partir de cron.
Patrick
@Patrick Bien sûr, c'est un problème si cron ne sait pas où est php, sinon le crontab Elzo fonctionnerait sans aucun problème, il DOIT être un problème de CHEMIN.
tmow
Merci beaucoup pour votre réponse. Cela a fonctionné pour moi avec très facilement !!! .. Merci beaucoup @tmow.
Vignesh Prajapati
5

Il existe quatre causes courantes pour lesquelles les commandes fonctionnent lorsqu'elles sont saisies dans un terminal mais pas à partir de cron, par ordre de commun:

  1. Cron fournit un environnement limité, par exemple, un minimum $PATHet d'autres variables attendues manquantes.
  2. Cron invoque / bin / sh par défaut, alors que vous utilisez peut-être un autre shell de manière interactive.
  3. Cron traite le caractère% spécialement (il est transformé en une nouvelle ligne dans la commande).
  4. Cron ne fournit pas d'environnement terminal ou graphique.

Si votre travail produit une sortie, y compris des messages d'erreur, cron vous envoie un e-mail avec la sortie entière. Assurez-vous de lire le courrier que vous recevez localement ou de le transférer à une adresse que vous lisez. Pour transférer le courrier d'un compte local vers une autre adresse, entrez l'autre adresse ~/.forward. Si la tâche cron est en cours d' exécution en tant qu'utilisateur du système ( root, webmaster, ...), assurez - vous que le courrier de l' utilisateur est redirigé vers vous (et tout autre administrateur); avec la plupart des configurations de messagerie, mettez des lignes comme root: elzodans /etc/aliases.

Gilles 'SO- arrête d'être méchant'
la source
2

Le démon cron exécute généralement votre commande dans un shell où la variable d'environnement PATH est limitée à une valeur par défaut du système, par exemple / usr / bin: / bin.

Probablement, votre phpcommande n'est pas disponible dans / usr / bin ou / bin et donc le script échoue lorsqu'il est exécuté via cron et s'exécute avec succès dans le cas contraire.

Cron signale généralement des erreurs ou des messages de travail via un courrier électronique à l'utilisateur root (c'est-à-dire lorsqu'une commande renvoie un état de sortie! = 0 ou produit une sortie vers stdout / stderr) une fois le travail terminé.

Selon votre système, vous devez configurer la distribution du courrier local pour obtenir ces messages.

maxschlepzig
la source