web-dev-qa-db-fra.com

Cron est exécuté mais le script ne fonctionne pas

Je sais qu'il y a beaucoup de questions similaires et j'ai essayé beaucoup de choses mais je ne peux toujours pas le faire fonctionner.

J'ai cronjob qui est programmé pour fonctionner sur 10min. Je peux voir dans /var/log/syslog qu'il est exécuté normalement

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 07:40:01 stan CRON[8304]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 07:50:01 stan CRON[8751]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 08:00:01 stan CRON[9347]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 08:10:01 stan CRON[9789]: (stan) CMD (stan /home/stan/update.sh)

update.sh appelle php script qui met à jour la base de données. Lorsque je lance directement à partir du terminal, la base de données de scripts Shell a été mise à jour et fonctionne parfaitement

./update.sh

Mais de cronjob ne met pas à jour la base de données. Mon cron

*/10 * * * * stan /home/stan/update.sh

La commande produite à partir du script shell est

/usr/bin/php /var/www/html/site/update.php

Autorisations des deux fichiers

-rwxrwxr-x  1 stan stan    123 Oct 20 15:09 update.sh
-rwxr-xr-x  1 stan www-data 1301 Oct 21 07:52 /var/www/html/site/update.php

Une idée de ce que peut être le problème?

Mise à jour: CHEMIN

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

update.sh

$ cat update.sh 
#!/bin/sh

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Référence ma question d'hier qui portait sur le shell et php concerne maintenant le cron.

$ whereis php

php: /usr/bin/php5.6 /usr/bin/php /usr/lib/php /etc/php /usr/include/php /usr/share/php5.6-intl /usr/share/php7.0-mbstring /usr/share/php7.0-common /usr/share/php5.6-curl /usr/share/php5.6-Gd /usr/share/php5.6-mcrypt /usr/share/php5.6-common /usr/share/php5.6-readline /usr/share/php5.6-json /usr/share/php /usr/share/php5.5-mbstring /usr/share/php5.6-opcache /usr/share/php5.6-mbstring /usr/share/php5.6-xml /usr/share/php5.5-common /usr/share/php5.6-mysql /usr/share/man/man1/php.1.gz

$ which php
/usr/bin/php
4
S.I.

Vous semblez confondre deux méthodes différentes pour invoquer des travaux cron.

Ubuntu hérite de Debian d’une politique quelque peu déroutante consistant à prendre en charge l’utilisateur crontabs qui est stocké dans une zone de spool /var/spool/cron, ainsi que les travaux cron exécutés à l’échelle du système exécutés à partir de /etc/crontab et les fichiers de /etc/cron.d.

Les tâches spécifiées dans /etc/crontab ou via des fichiers dans /etc/cron.d nécessitent un champ supplémentaire pour pouvoir être exécutées sous un autre utilisateur.

*/10 * * * * <username> <command> <args>

Les tâches configurées via la zone de spool à l'aide de crontab -e (ou Sudo crontab -e pour root) appartiennent déjà à un utilisateur spécifique et n'ont pas besoin du champ utilisateur.

*/10 * * * * <command> <args>

Si vous incluez le champ nom d'utilisateur dans un travail cron configuré via une commande crontab -e, il sera interprété à tort comme une commande: comme nous pouvons le voir à partir de votre sortie de journal,

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)

cron interprète stan comme une commande avec argument/home/stan/update.sh

La solution devrait être simplement de supprimer le nom d'utilisateur stan de votre crontab.

4
steeldriver

quelques problèmes possibles:

1) Vous ne pouvez pas avoir #!/bin/sh comme première ligne de update.sh

2) PHP peut avoir besoin d'exécuter des commandes supplémentaires, mais les tâches périodiques sont exécutées sans que la variable PATH soit définie. Pour résoudre ce problème, utilisez echo $PATH sur le terminal où la commande fonctionne, puis utilisez export PATH=..., en remplaçant le ... par le résultat de echo $PATH ci-dessus.

3) PHP peut avoir besoin d'autres variables d'environnement pour fonctionner. Repérez-les et exportez-les dans update.sh avant d'appeler /usr/bin/php.

Éditer

OK, ce n'est pas 1)

Ouvrez une nouvelle fenêtre (ou une nouvelle connexion ssh) et exécutez:

for i in `env | sed 's/=.*//'` ; do unset $i ; done

Cela désélectionnera toutes les variables d'environnement, y compris le PATH. Alors essaye:

/usr/bin/php /var/www/html/site/update.php

Ensuite, postez ici les messages d'erreur.

2
sмurf

Le problème est la recherche très limitée de variable de chemin de crontab. Un chemin complet doit être ajouté pour ajouter à presque toutes vos commandes dans tous vos scripts et sous-scripts. Ou vous pouvez ajouter le même chemin de recherche au script que lorsque vous exécutez le script manuellement.

Changer de:

#!/bin/sh

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Changer en:

#!/bin/sh

PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Note:

La recherche de chemin ajouté provient de ce que vous avez posté dans votre question, ce qui fonctionne lorsque vous exécutez le script manuellement. Si vous savez quel chemin contient la commande du script ainsi que tout script ou commande appelé par le script update.php, il s’agit du seul chemin de recherche à ajouter .

2
L. D. James