Problème de tâche cron qui ne s'exécute pas

Bonjour c’est encore moi décidément ce serveur m’aura donné du fil à retorde.
Je souhaite mettre en place un script cron qui me récupère la base de donnée d’un poste me l’injecte dans ma base de données de mon application puis me lance un script de calcul de stock.

Ce script est un script PHP qui fonctionne impeccablement bien s’il est lancé manuellement.

Pour cela j’édite mon fichier cron à laide de crontab -e et j’y met le contenu suivant

25 23   * * 1-5 /var/www/html/sygecarV3/exploitation/transfert/execution.php >> /home/log_cron_bascule.log

Mon cron me crée bien à l’heure indiqué mon fichier log_cron_bascule.log mais celui-ci est vide et mon script php ne s’est pas exécuté.

Dans le script tous les includes sont fait avec des chemins absolus du style

/var/www/html/sygecarV3/exploitation/ventes/updateStock/stock.php

Merci par avance pour votre utile aide j’espère.

En tous cas votre forum est au top avec des personnes cool et réactive ça fait plaisir d’en trouver sur le net :wink:

Salut

Il faut utiliser l’interpréteur PHP pour exécuter un script .php

J’ai repensé à un sujet qui l’évoque :

Faire de même pour l’interpréteur php ; utiliser son chemin absolu.
Surtout dans une entrée cron.

which php

J’ai trouvé il me manquait

/usr/bin/php5.6

avant le chemin vers mon script.
Je ne ferme pas la discussion car j’ai d’autre script bash à mettre mais il ne semble pas fonctionner que dois-je mettre ?

Il me semble particulier ton chemin vers l’interpréteur PHP :wink:

Montrer ce qui ne marche pas d’abord.

Il faut faire attention avec des tâches cron qui sont mal écrites
car des dommages ou un comportement imprévisible peuvent en résulter.

/usr et pas /etc la fatigue :confused:

Celui-ci par exemple ne fonctionne pas

08 00 * * 1-5 /var/www/html/sygecarV3/sql/script

il s’agit d’un script contenant ceci.

mysqldump -h localhost -u xxxxx -pxxxxxx --add-drop-database -B sygecarV3 > dump_sygecarV3.sql
08 00 * * 1-5 /bin/sh -c /var/www/html/sygecarV3/sql/script > /dev/null

/var/www/html/sygecarV3/sql/script doit être exécutable
par l’user qui exécute la tâche cron.

#!/bin/sh
/chemin/vers/mysqldump -h localhost -u xxxxx -pxxxxxx --add-drop-database -B sygecarV3 > /chemin/vers/destination/dump_sygecarV3.sql

Yes ça fonction impeccable enfin dernière chose j’ai deux scripts en bash cette fois qui me permette avec rsync d’aller chercher les données de mon serveur 1 et de les sauvegarder sur le disque 1 du serveur 2 et le disque 2 du serveur 2.

Les deux script sont identiques il n’y a que le dossier qui change.
Le premier fonctionne impeccable mais le deuxième ne se lance pas.

Ci-joint le crontab -e

55 00 * * 1-5 /bin/sh -c /home/sdbbackup/script/script_sauvegarde_disque_1
57 00 * * 1-5 /bin/sh -c /home/sbdbackup/script/script_sauvegarde_backup

Le code du script_sauvegarde_disque_1

#!/bin/bash -x
log="/home/log/sauvegarde_backup.log"
login="xxx"
host="192.xxx.xxx.xxx"
src="/home"
src_sygecar="/var/www/html"
dossier_sygecar="sygecarV3"
dest="/home/sauvegarde_sdbr"
statut="completed successfully"
cmddate="`date +[%d/%b/%Y:%H:%M:%S]`"
echo "$cmddate Backup SDBR started" > $log
tab=(
        "archives/"
        "dossier1/"
        "exploitation/"
        "dossier2/"
        "dossier3/"
        "prive/"
        "public/"
        "dossier4/"
)
fin=${#tab[*]}
fin=$(( $fin - 1 ))
for i in `seq 0 $fin`;
do
        cmddate="`date +[%d/%b/%Y:%H:%M:%S]`"
        echo -n $cmddate ${tab[$i]} >> $log
        rsync -P -v --update -r -e ssh $login@$host:$src/${tab[$i]} $dest/${tab[$i]}
        retour=$?
        if [[ $retour == 0 ]]
                then
                        echo " Completed successfully" >> $log
        else
                echo " ERROR" >> $log
                statut="ERROR"
        fi
done

et le code du script_sauvegarde_backup

#!/bin/bash -x
log="/home/log/sauvegarde_backup.log"
login="xxx"
host="192.xxx.xxx.xxx"
src="/home"
src_sygecar="/var/www/html"
dossier_sygecar="sygecarV3"
dest="/backup"
statut="completed successfully"
cmddate="`date +[%d/%b/%Y:%H:%M:%S]`"
echo "$cmddate Backup SDBR started" > $log
tab=(
        "archives/"
        "dossier1/"
        "exploitation/"
        "dossier2/"
        "dossier3/"
        "prive/"
        "public/"
        "dossier4/"
)
fin=${#tab[*]}
fin=$(( $fin - 1 ))
for i in `seq 0 $fin`;
do
        cmddate="`date +[%d/%b/%Y:%H:%M:%S]`"
        echo -n $cmddate ${tab[$i]} >> $log
        rsync -P -v --update -r -e ssh $login@$host:$src/${tab[$i]} $dest/${tab[$i]}
        retour=$?
        if [[ $retour == 0 ]]
                then
                        echo " Completed successfully" >> $log
        else
                echo " ERROR" >> $log
                statut="ERROR"
        fi
done

Bien sur si lancé manuellement aucun problème de fonctionnement

Demande plus de deux minutes pour se terminer ?

Ton cron suivant est à 00:57 ; deux minutes après.
Et sans étudier les scripts, je pense qu’ils utilisent des ressources communes.
Et tu invoques des scripts bash avec /bin/sh -c
Je ne connais pas encore ce -x de #!/bin/bash -x
:thinking::face_with_raised_eyebrow:

On va attendre les codeurs.
Là, je vais t’induire en erreur et il est tard.

Je te recommande de finir les lignes de tes entrées crontab par : > /dev/null
Comme pour le script précédent.

Une tâche cron ne doit produire aucune sortie standard ;
risque de dommages encourus autrement.
Ou de comportement imprévisible.

Dans mon test oui il met mois de 2 minutes pour finir car j’ai déjà lancé les commandes manuellement donc il n’y a rien à ramener.

Oups oui j’ai changé dans le crontab par /bin/bash

Pour le #!/bin/bash -x j’ai un autre script qui fait la même chose sur un autre serveur et il fonctionne impeccablement une question à quoi sert le -c après /bin/sh ?

Merci

Il donne à exécuter le script précisé après.

man sh
−c Read commands from the command_string operand.
Set the value of special parameter 0
(see Section 2.5.2, Special Parameters)
from the value of the command_name  operand and the positional
parameters ($1, $2, and so on) in sequence from the remaining
argument operands.
No commands shall be read from the standard input.

Il a une option lui aussi pour donner à exécuter un script en argument.
C’est la même (-c)

man bash

Ok merci.

Bon je verrais demain pour trouver une solution dommage parce que j’avais plus qu’à ça pour terminer :confused:

Merci beaucoup pour ton aide bien précieuse

Je te fais remarquer la coquille sbdbackup
Ce ne doit être que ça.

Il peut y avoir des éléments qui restent à différencier - ou peuvent l’être - entre les deux scripts.
ie : le journal.

J’ai regardé pour le #!/bin/bash -x
Et il me semble que cela n’ait aucun effet particulier d’utiliser -x dans ce contexte.

Tu es un génie :star_struck::face_with_monocle:
Effectivement c’était juste cette petite faute de frappe à la noix.

En même temps à y avoir passé 3 jours sur le serveur je ne voyais plus rien.

Un grand merci à toi et aux autres qui m’ont aidé sur ce forum durant ses 3 jours.

Nicolas

1 J'aime