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
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.
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.
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 .