Souci avec cron et script bash

Hello les linuxiens,
J’ai un petit souci que j’essai de résoudre mais je ne vois absolument pas d’ou ça vient.
J’ai un JOB cron

00 7 * * */2 /home/moi/scripts/sitesave.sh

sitesave.sh est un script qui lance des sauvegardes des mes sites distants

Si je lance ce script a la mano, aucun problème.
Il me log correctement mes sauvegardes
Je vous met le code afin de mieux comprendre

function rsync_site(){
    clear
    echo "Sauvegarde de $3 demarrer NE RIEN TOUCHER"
    sleep 2
    rsync -aP --exclude-from='exclude_files.txt' --delete-before -e "ssh -p $4" "$1" "$2"
}
function rsync_restore(){
    clear
    echo "Restauration de $3 va demarrer NE RIEN TOUCHER"
    rsync -aP --dry-run --exclude-from='exclude_files.txt' --delete-before -e "ssh -p $4" "$2" "$1"
}

function verif_log(){
if [ $1 = 0 ];then
   echo -e "${gris}
-----------------------------------------------------------------
La sauvegarde de $2 à été effectué avec succés
Le $DATE
-----------------------------------------------------------------
" ${neutre}>>$LOGS
else
    echo -e "${rougefonce}
----------------------------------------------------------------
Sauvegarde de $2 FAILED
Le $DATE
----------------------------------------------------------------${neutre}" >>$LOGS
    exit 1
fi
}
for f in ${!ROOT_PATH[@]};do
    rsync_site ${ROOT_PATH["$f"]} ${TARGET["$f"]} ${DOMAIN["$f"]} ${PORT["$f"]}
     result=$?
    verif_log $result ${DOMAIN["$f"]}
done

Seulement cron ne veut pas me lancé ce script automatiquement, je me retrouve avec une erreur comme quoi cela n’a pas été effectué dans mon fichier de LOG.

Je vois pourtant bien cron lancé le script, mais ca FAIL quand cron le lance et pas manuellement.
Avec le même USER bien évidement

syslog me retourne bien son éxécution

Aug  7 07:00:01 DebianDesktop CRON[82141]: (moi) CMD (/home/moi/scripts/sitesave.sh )
Aug  9 07:00:01 DebianDesktop CRON[89873]: (moi) CMD (/home/moi/scripts/sitesave.sh )
Aug 11 07:00:02 DebianDesktop CRON[95453]: (moi) CMD (/home/moi/scripts/sitesave.sh )
Aug 13 07:00:01 DebianDesktop CRON[99613]: (moi) CMD (/home/moi/scripts/sitesave.sh )

et les log pour voir que le script est bien executer qui montre bien que ca FAILED

----------------------------------------------------------------
Sauvegarde de *************** FAILED
Le 2022-08-14-07:00:01
----------------------------------------------------------------

----------------------------------------------------------------
Sauvegarde de ************ FAILED
Le 2022-08-16-07:00:01
----------------------------------------------------------------

----------------------------------------------------------------
Sauvegarde de ************** FAILED
Le 2022-08-18-07:00:01
----------------------------------------------------------------

-----------------------------------------------------------------
La sauvegarde de ************** à été effectué avec succés
Le 2022-08-19-21:06:02
-----------------------------------------------------------------
 

-----------------------------------------------------------------
La sauvegarde de ************* à été effectué avec succés
Le 2022-08-19-21:06:02
-----------------------------------------------------------------
 

-----------------------------------------------------------------
La sauvegarde de ********** à été effectué avec succés
Le 2022-08-19-21:06:02
-----------------------------------------------------------------

Voila j’avoue que je sèche un peu et que je ne capte pas trop pourquoi il échou avec CRON et pas si je le lance moi-même.

Merci

salut
je ne comprends pas d’où viennent les $1,$2,$3,$4

as-tu donné le programme complet?

2 propositions de solution :

  1. dans cron, mettre
sh -e "/home/moi/scripts/sitesave.sh"
  1. remplacer rsync par /usr/bin/rsync

Ce sont des paramètres positionnels

Pour des raisons évidentes de sécurité je n’ai pas affiché mes variables oui

Pour le chemin absolu, je pourrais éventuellement essayer, même si mon $PATH est correct, je n’y crois que moyennement

sh est un lien symbolique vers dash dans Debian.

Le script est bien executé puisqu’il me log le FAIL, donc j’émet des doute mais même chose avec bash -e

Bonjour

Sans connaître la valeur qui sera assignée à chacune de ces variables, et pour les mêmes raisons évidentes de sécurité, je ne pense pas que tu trouveras quelqu’un d’assez joueur pour se risquer à prendre la responsabilité de te proposer une solution qui ne pourrait, dans ce contexte inconnu, être pertinente.

Cette phrase ne nous apporte aucune information car elle ne nous permet pas de savoir comment tu as vérifié la valeur de la variable PATH, ni dans quel contexte, ni quelle est la valeur qui est assignée à cette variable d’environnement.


C’est dans le contexte d’exécution de ton script qu’il faudrait vérifier la valeur qui est assignée aux variables d’environnement.

Tu pourrais ajouter dans les premières lignes de ton script,
la ligne de commande suivante :

/usr/bin/env >> "$LOGS"

ce qui te permettrait ensuite, en lisant le contenu du fichier dont le nom aura été associé comme valeur à la variable $LOGS, de pouvoir vérifier quelle est la valeur qui a été assignée à chacune des variables d’environnement dans le contexte d’exécution de ton script.

Entre autres, dans la valeur qui sera assignée à la variable d’environnement SHELL qui sera retournée par l’exécution de la commande env quand elle sera lancée par ton script qui sera lui même lancé par l’exécution de la ligne de commande que tu as ajoutée dans ta crontab,
tu pourras constater que ton script n’est pas interprété par le l’interpréteur de commandes /usr/bin/bash mais par /usr/bin/dash


Tu pourrais aussi utiliser l’option --log-file=unficherlog.txt de la commande rsync

Voir aussi comment récupérer les éventuelles erreurs d’exécution de la commande ssh

Il y a peut-être un problème d’authentification par clef ou autre mot de passe chiffré.

Difficile de pouvoir proposer une piste pertinente sans voir ni les lignes de commande(s) ni les messages d’erreur.

1 J'aime

Bonjour,

As-tu essayé de remplacer $1, $2, $3 et $4 par leurs valeurs en dur dans un premier temps de manière à faire la part des choses, à identifier la source du problème ?

1 J'aime

Evidemment, je comprends que tu caches des trucs, mais pour tester tu pourraient créer des faux qui nous permettent de faire le boulot.

Avec tout ce qu’on t’a dit tu devrais retrouver.

J’ai déjà eu le même problème que j’ai résolu en mettant le chemin complet, d’où nos propositions.

Bonjour à tous ,
Tout d’abord merci pour vos interventions
Je vous met ici le script complet


#!/bin/bash
gris='\e[0;32m'
rougefonce='\e[0;31m'
neutre='\e[0;m'
LOGS="/home/XXXXXX/log/log_save_site"
DATE=$(date +%F-%T)
ROOT_PATH=("XXXXXXX@XXXXXXX:/home/XXXXXXXXX/public_html/public_html/" "XXXXXX@XXXXXXXX:/var/www/DOMAIN" "XXXXXX@XXXXXXXXX:/var/www/DOMAIN")
PORT=("65002" "4567" "4567")
TARGET=("/home/XXXXXXXX/mount/backup/DOMAIN/siteweb" "/home/XXXXXXX/mount/backup/DOMAIN" "/home/XXXXXX/mount/backup/DOMAIN")
DOMAIN=("SITE1" "SITE2" "SITE3")

##Use $1 source $2 target $3 name_of_backup $4 port_ssh
/usr/bin/env >> "$LOGS"

function rsync_site(){
    clear
    echo "Sauvegarde de $3 demarrer NE RIEN TOUCHER"
    sleep 2
    rsync -aP --exclude-from='exclude_files.txt' --delete-before -e "ssh -p $4" "$1" "$2"
}
function rsync_restore(){
   clear
    echo "Restauration de $3 va demarrer NE RIEN TOUCHER"
    rsync -aP --exclude-from='exclude_files.txt' --delete-before -e "ssh -p $4" "$2" "$1"
}

function verif_log(){
if [ $1 = 0 ];then
   echo -e "${gris}
-----------------------------------------------------------------
La sauvegarde de $2 à été effectué avec succés
Le $DATE
-----------------------------------------------------------------
" ${neutre}>>$LOGS
else
    echo -e "${rougefonce}
----------------------------------------------------------------
Sauvegarde de $2 FAILED
Le $DATE
----------------------------------------------------------------${neutre}" >>$LOGS
    exit 1
fi
}
for f in ${!ROOT_PATH[@]};do
    rsync_site ${ROOT_PATH["$f"]} ${TARGET["$f"]} ${DOMAIN["$f"]} ${PORT["$f"]}
     result=$?
    verif_log $result ${DOMAIN["$f"]}
done

A @MicP Tu as bien mis le doigt sur le problème.
Je vais regarder en ce sens, pour résoudre le soucis


Je vois bien avec le LOG d'env qu'il y a un soucis a ce niveau. Je reviendrai avec la solution.
Je vais devoir revoir ma théorie, mais il me semble quand même que les variables d'environnements sont hérités du processus parent, donc devrait être celui de mon utilisateurs.
Merci à tous pour vos interventions

Re,

Je reviens vers vous et un grand merci particulièrement a MicP qui m’a mis sur la bonne voie, merci également aux autres personnes qui ont participer.

Le souci venait de la variable d’environnement SSH_AUTH_SOCK qui ne prend pas le bon socket.

j’ai laissé le script tel quel
j’ai simplement ajouter une vérification et ajouter les bonnes valeurs au moment de l’éxécution


Voici ce que j'ai ajouté
if [[ -z $SSH_AUTH_SOCK ]];then 
eval $(keychain --eval ~/.ssh/desktopdebian)
 
elif [[ -n $SSH_AUTH_SOCK ]];then 
keychain --query | xargs -I % bash -c 'export %'

else
	echo "FAILED BECAUSE SSH CANNOT FIND AGENT"
	exit 1 

fi

Sujet Résolu donc,
Attention cette solution n’est pas portable à cause de l’utilisation de keychain donc ne pas coller ce code sans savoir