Qu'est-ce qui emp=c3=aache un script php de s'=c3=a9cuter en CRON =3f

10 réponses
Avatar
Didier
Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL vers
des fichiers .csv), je rajoute deux commandes "copy" toutes simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui marchait
bien initialement, s'éxécute, mais pas les deux commandes "copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce ...
Je suis sur un RaspBerry PI 3+, sous Jessie.
Merci.
Didier.

10 réponses

Avatar
Denis Beauregard
Le Tue, 24 Sep 2019 16:41:26 +0200, Didier
écrivait dans fr.comp.lang.php:
Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL vers
des fichiers .csv), je rajoute deux commandes "copy" toutes simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui marchait
bien initialement, s'éxécute, mais pas les deux commandes "copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce ...
Je suis sur un RaspBerry PI 3+, sous Jessie.

C'est la commande system ? Il faut peut-être tout bonnement changer
le dossier actif avant de faire les copies ?
Denis
Avatar
Olivier Miakinen
Bonjour,
Le 24/09/2019 à 16:41, Didier a écrit :
Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL vers
des fichiers .csv), je rajoute deux commandes "copy" toutes simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui marchait
bien initialement, s'éxécute, mais pas les deux commandes "copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce ...
Je suis sur un RaspBerry PI 3+, sous Jessie.

Je ne connais pas le Raspberry PI, mais je vais supposer que ça
fonctionne comme un GNU/Linux. Ceci étant posé, voici quelques
suggestions.
1) Quand tu lances PHP et le script via CRON, tu n'as pas les mêmes
droits d'accès que quand tu le lances à la main.
-> Essaye de copier dans un répertoire dont les droits sont 777
(écriture autorisée pour tout le monde).
2) Tu copies en donnant un chemin relatif « truc/chose » alors que
le répertoire courant n'est pas le même quand tu le lances via
CRON.
-> Essaye de copier vers un chemin absolu « /machin/truc/chose ».
3) Ta commande "copy" toute simple est un script maison qui appelle
la commande standard /bin/cp, mais elle n'est plus dans le PATH
quand tu l'appelles par CRON.
-> Essaye d'utiliser la commande standard, avec son chemin d'accès
complet « /bin/cp ».
--
Olivier Miakinen
Avatar
Didier
Le 24/09/2019 à 18:18, Denis Beauregard a écrit :
Le Tue, 24 Sep 2019 16:41:26 +0200, Didier
écrivait dans fr.comp.lang.php:
Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL vers
des fichiers .csv), je rajoute deux commandes "copy" toutes simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui marchait
bien initialement, s'éxécute, mais pas les deux commandes "copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce ...
Je suis sur un RaspBerry PI 3+, sous Jessie.

C'est la commande system ? Il faut peut-être tout bonnement changer
le dossier actif avant de faire les copies ?
Denis

Bonjour, et merci.
non, je me sius mal exprimé, ce n'est pas une commande copy, mais
l'instruction php copy.
Voici les lignes qu ne s'éxécutent pas :
$rep="/media/cle-usb/";
copy("Comptes.txt",$rep."Comptes.txt");
Didier.
Avatar
Olivier Miakinen
Le 24/09/2019 à 20:18, Didier répondait à Denis Beauregard :
C'est la commande system ? Il faut peut-être tout bonnement changer
le dossier actif avant de faire les copies ?

non, je me sius mal exprimé, ce n'est pas une commande copy, mais
l'instruction php copy.

D'accord. Ceci, donc :
<https://www.php.net/manual/en/function.copy.php>
Voici les lignes qu ne s'éxécutent pas :
$rep="/media/cle-usb/";
copy("Comptes.txt",$rep."Comptes.txt");

Tu as bien mis un chemin absolu pour la destination (à savoir
/media/cle-usb/Comptes.txt) mais pas pour la source (c'est
seulement Comptes.txt). Es-tu sûr que le répertoire courant
est bien celui que tu crois, quand le script est lancé par
cron ?
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 24/09/2019 à 20:26, je demandais à Didier :
Tu as bien mis un chemin absolu pour la destination (à savoir
/media/cle-usb/Comptes.txt) mais pas pour la source (c'est
seulement Comptes.txt). Es-tu sûr que le répertoire courant
est bien celui que tu crois, quand le script est lancé par
cron ?

Voir les commandes getcwd() et chdir() :
<https://www.php.net/manual/en/book.dir.php>
--
Olivier Miakinen
Avatar
Didier
Le 24/09/2019 à 18:33, Olivier Miakinen a écrit :
Bonjour,
Le 24/09/2019 à 16:41, Didier a écrit :
Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL vers
des fichiers .csv), je rajoute deux commandes "copy" toutes simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui marchait
bien initialement, s'éxécute, mais pas les deux commandes "copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce ...
Je suis sur un RaspBerry PI 3+, sous Jessie.

Je ne connais pas le Raspberry PI, mais je vais supposer que ça
fonctionne comme un GNU/Linux.

Oui, effectivement, basé sur Debian.
Ceci étant posé, voici quelques
suggestions.
1) Quand tu lances PHP et le script via CRON, tu n'as pas les mêmes
droits d'accès que quand tu le lances à la main.

Le script contient tout un bloc d'instructions qui s'éxécutent bien; j'y
ai juste rajouté à la fin :
$rep="/media/cle-usb/";
copy("Comptes.txt",$rep."Comptes.txt");
Cette "copy" ne s'exécute pas.
Je pense donc que les droits sont OK (j'ai pas mal galéré il y a qq mois
sur ce point pour faire fonctionner ce script via CRON, mais demuis ce
temps-là il me sauvegarde mes tables MySQL fidèlement toutes les nuits à
00:00).
-> Essaye de copier dans un répertoire dont les droits sont 777
(écriture autorisée pour tout le monde).
2) Tu copies en donnant un chemin relatif « truc/chose » alors que
le répertoire courant n'est pas le même quand tu le lances via
CRON.

Eh oui ! C'est bien le chemin relatif qui pose problème dans le CRON.
Une fois dit, ça paraît évident, mais c'est mieux quand quand on a un
petit coup de main là-dessus.
Chapeau bas ! Je viens de vérifier, c'est nickel.
Un très grand merci !
Didier.
Avatar
Olivier Miakinen
Le 24/09/2019 à 20:30, Didier a écrit :

Eh oui ! C'est bien le chemin relatif qui pose problème dans le CRON.
Une fois dit, ça paraît évident, mais c'est mieux quand quand on a un
petit coup de main là-dessus.

Et donc, tu peux oublier ma réponse de 20 h 29.
Chapeau bas ! Je viens de vérifier, c'est nickel.
Un très grand merci !

:-)
--
Olivier Miakinen
Avatar
Lulu
Le 24-09-2019, Didier a écrit :
Le 24/09/2019 à 18:33, Olivier Miakinen a écrit :
Le 24/09/2019 à 16:41, Didier a écrit :
Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme
prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL
vers des fichiers .csv), je rajoute deux commandes "copy" toutes
simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui
marchait bien initialement, s'éxécute, mais pas les deux commandes
"copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce
...
Je suis sur un RaspBerry PI 3+, sous Jessie.

Je ne connais pas le Raspberry PI, mais je vais supposer que ça
fonctionne comme un GNU/Linux.

Oui, effectivement, basé sur Debian.
Ceci étant posé, voici quelques suggestions.
1) Quand tu lances PHP et le script via CRON, tu n'as pas les mêmes
droits d'accès que quand tu le lances à la main.

Le script contient tout un bloc d'instructions qui s'éxécutent bien; j'y
ai juste rajouté à la fin :
$rep="/media/cle-usb/";
copy("Comptes.txt",$rep."Comptes.txt");
Cette "copy" ne s'exécute pas.

Elle s'exécute.
Mais comme tu ne regardes pas la sortie d'erreur, tu ne vois pas ce qui
cloche...
(En même temps que j'écris ça, je ne me souviens plus de comment faire
pour récupérer le code d'erreur ;-)
Je pense donc que les droits sont OK (j'ai pas mal galéré il y a qq
mois sur ce point pour faire fonctionner ce script via CRON, mais
demuis ce temps-là il me sauvegarde mes tables MySQL fidèlement
toutes les nuits à 00:00).
-> Essaye de copier dans un répertoire dont les droits sont 777
(écriture autorisée pour tout le monde).
2) Tu copies en donnant un chemin relatif « truc/chose » alors que
le répertoire courant n'est pas le même quand tu le lances via
CRON.

Eh oui ! C'est bien le chemin relatif qui pose problème dans le CRON.
Une fois dit, ça paraît évident, mais c'est mieux quand quand on a un
petit coup de main là-dessus.
Chapeau bas ! Je viens de vérifier, c'est nickel.
Un très grand merci !
Didier.

Classique !
Mais ton message est utile, au moins pour ceux (dont moi) qui ne
penseraient pas à regarder systématiquement la sortie d'une commande
(standard ET erreur).
Avatar
Didier
Le 03/12/2019 à 00:22, Lulu a écrit :
Le 24-09-2019, Didier a écrit :
Le 24/09/2019 à 18:33, Olivier Miakinen a écrit :
Le 24/09/2019 à 16:41, Didier a écrit :


Bonjour,
J'ai un script PHP appelé par une tâche CRON. Tout va bien comme
prévu.
A la fin de ce script (dédié à faire des sauvegardes de bases MySQL
vers des fichiers .csv), je rajoute deux commandes "copy" toutes
simples.
Si je lance ce script à la main, il s'éxécute bien en entier.
Si je laisse faire la tâche CRON, seule la première partie, qui
marchait bien initialement, s'éxécute, mais pas les deux commandes
"copy" rajoutées.
Je sèche, et si quelqu'un voulait bien me donner un coup de pouce
...
Je suis sur un RaspBerry PI 3+, sous Jessie.

Je ne connais pas le Raspberry PI, mais je vais supposer que ça
fonctionne comme un GNU/Linux.


Oui, effectivement, basé sur Debian.

Ceci étant posé, voici quelques suggestions.
1) Quand tu lances PHP et le script via CRON, tu n'as pas les mêmes
droits d'accès que quand tu le lances à la main.

Le script contient tout un bloc d'instructions qui s'éxécutent bien; j'y
ai juste rajouté à la fin :
$rep="/media/cle-usb/";
copy("Comptes.txt",$rep."Comptes.txt");
Cette "copy" ne s'exécute pas.

Elle s'exécute.
Mais comme tu ne regardes pas la sortie d'erreur, tu ne vois pas ce qui
cloche...
(En même temps que j'écris ça, je ne me souviens plus de comment faire
pour récupérer le code d'erreur ;-)
Je pense donc que les droits sont OK (j'ai pas mal galéré il y a qq
mois sur ce point pour faire fonctionner ce script via CRON, mais
demuis ce temps-là il me sauvegarde mes tables MySQL fidèlement
toutes les nuits à 00:00).

-> Essaye de copier dans un répertoire dont les droits sont 777
(écriture autorisée pour tout le monde).
2) Tu copies en donnant un chemin relatif « truc/chose » alors que
le répertoire courant n'est pas le même quand tu le lances via
CRON.

Eh oui ! C'est bien le chemin relatif qui pose problème dans le CRON.
Une fois dit, ça paraît évident, mais c'est mieux quand quand on a un
petit coup de main là-dessus.
Chapeau bas ! Je viens de vérifier, c'est nickel.
Un très grand merci !
Didier.

Classique !
Mais ton message est utile, au moins pour ceux (dont moi) qui ne
penseraient pas à regarder systématiquement la sortie d'une commande
(standard ET erreur).
Bjr,

je ne sais pas non plus où regarder les logs d'erreurs de ce processus
(j'y ai bien pensé, et j'ai cherché).
Didier.
Avatar
Jo Engo
Le Tue, 03 Dec 2019 09:34:41 +0100, Didier a écrit :
je ne sais pas non plus où regarder les logs d'erreurs de ce processus
(j'y ai bien pensé, et j'ai cherché).

ça n'est pas cron qui gère ça ? Un petit man cron pje dit ça mais je ne
l'ai pas encore fait) autrement tout part sur la console
en agissant sur la crontab quelque chose comme :
php /path/ton-script |tee /ton/home/scripts/sortie 2> /ton/home/scripts/sortie-erreur
--
Travailles au flash avec un Canon, et tu comprendras vite que le mode
manuel est ta planche de salut ! ;o))
-+- Pierre, sur fr.rec.photo -+-