Page 1 of 1

[RESOLU] Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 13:13
by ernie
Bonjour,

J'utilise en script pour sauvegarder mon nas vers un backup et m'envoyer le rapport:

Code: Select all

#!/bin/sh
monlog=rsync_versnas2_`date +%Y-%m-%d_%Hh%Mmn`.log
echo "Sauvegarde de document" >> ./$monlog
/usr/local/bin/rsync -avrhstx --stats --progress --exclude '.zfs' /mnt/pool1/documents ip::pool2data>>./$monlog
echo "Sauvegarde de document terminee" >> ./$monlog
echo "-------------------------------------------------------------------" >> ./$monlog
echo "Sauvegarde bis de videos perso" >> ./$monlog
/usr/local/bin/rsync -avrhstx --stats --progress --exclude '.zfs' /mnt/pool1/videos/perso ip::pool3>>./$monlog
echo "Sauvegarde bis de videos perso terminee" >> ./$monlog
PRINTF=/usr/bin/printf
MSMTP=/usr/local/bin/msmtp
MSMTPCONF=/var/etc/msmtp.conf
# change these variables!
FROM="email1"
TO="email2"
SUBJECT="Rsync"
BODY="Sauvegarde effectuée : compte rendu"
# say you want to send the output of file /root/file.txt
# BODY="$(cat /mnt/pool1/sup/script/$monlog)"
BODY="$(cat /mnt/pool1/sup/script/$monlog | sed 's/%/%%/g')"
# send mail
$PRINTF "From:$FROM\nTo:$TO\nSubject:$SUBJECT\n\n$BODY" | $MSMTP --file=$MSMTPCONF -t
cp /mnt/pool1/sup/script/$monlog /mnt/pool1/sup/rsync/
rm /mnt/pool1/sup/script/$monlog
Via la console de Fedora, il s'éxécute et je reçois l'email contenant le rapport.

Via le cron en executer maintenant, il y a une erreur et je reçois un mail vide.
Pour le cron j'ai : /mnt/pool1/sup/script/synchro

Une idée ?

ATTENTION : valable pour la version 1310 de Nayla. Surement different pour les autres versions de Nayla ou de nas4free.

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 16:45
by velivole18
Bonjour,

Il faut savoir que lorsqu'un script s'exécute via cron, il est dans un environnement "vide", c'est à dire sans aucune variable d'environnement.
Au contraire, lorsqu'on se connecte sur une console, on est déjà dans un environnement "préparé" avec des variables et des scripts d'initialisation qui ont préparé notre environnement d'exécution.
On se fait donc souvent avoir avec cette différence qui fait qu'un script fonctionne lorsqu'on le teste dans sa console et qu'il ne fonctionne plus sous cron.
Donc peut-être à réfléchir de ce côté là. Partez du principe que sous cron, aucune variable de pré-définie et aucun environnement préparé.

Cordialement.

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 16:53
by ernie
OK. Cependant je suis novice, donc comment identifier l'environnement sous console ?

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 17:11
by dhenin
"OK. Cependant je suis novice, donc comment identifier l'environnement sous console ?"

On écrit sur la ligne de commande
$ env
ou
$ set

On peut comprendre la différence entre ces deux commandes là

http://unix.stackexchange.com/questions ... ables-in-b

bon courage

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 18:55
by ernie
Je dirais que c'est la partie d'envoie d'email.

J'ai rajouter | sed 's/%/%%/g' pour traiter les signes % qui apparaissent dans le rapport.

je cherche...

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 19:19
by velivole18
Bonsoir,

Effectivement, je n'ai pas été très clair dans ma réponse.
Pour voir la différence entre le mode cron et console, il suffit de faire s'exécuter un script ne comportant que la commande env sous cron et de faire cette même commande dans une console et on voit la différence.

Cordialement.

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 20:38
by ernie
Merci

J'ai le résultat de env de la console.

Par contre via le cron comment voir le résultat ?

J'ai tenté :

Code: Select all

#!/bin/sh
monlog=env_`date +%Y-%m-%d_%Hh%Mmn`.log
env >> ./$monlog
mais rien dans root ni dans le répertoire où il y a le script.

De plus dans le resultat de ENV sous la console je vois:
MAIL=/var/mail/root

je soupçonne que cela manque à cron. J'ai juste à le rajouter tel quel dans le script ?

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 21:03
by ernie
Complément:

J'ai retrouvé le resultat du script contenant env: c'est mis dans /usr/local/www

Sous la console j'ai en executant le script (d'ailleurs le resultat n'est pas mis au meme endroit, à cause des variables d'environnements différentes)

Code: Select all

VENDOR=amd
LOGNAME=root
PAGER=more
LANG=en_US.UTF-8
OSTYPE=FreeBSD
MACHTYPE=x86_64
MAIL=/var/mail/root
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin
EDITOR=nano
UNISON=/mnt
PWD=/mnt/pool1/sup/script
GROUP=wheel
TERM=xterm-256color
SSH_TTY=/dev/pts/1
HOME=/root
USER=root
LANGUAGE=en_US.UTF-8
HOSTTYPE=FreeBSD
SHELL=/bin/tcsh
LC_ALL=en_US.UTF-8
BLOCKSIZE=K
SHLVL=1
Via cron j'obtiens :

Code: Select all

LANG=fr
HTTP_ACCEPT_LANGUAGE=fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
HTTP_CONTENT_LENGTH=265
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
DOCUMENT_ROOT=/usr/local/www
HTTP_CONNECTION=keep-alive
SCRIPT_NAME=/system_cron_edit.php
REDIRECT_STATUS=200
HTTP_USER_AGENT=Mozilla/5.0 (X11; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0
PWD=/usr/local/www
REQUEST_METHOD=POST
SERVER_SOFTWARE=lighttpd/1.4.35
SERVER_PROTOCOL=HTTP/1.1
CONTENT_LENGTH=265
HTTP_ACCEPT_ENCODING=gzip, deflate
CONTENT_TYPE=application/x-www-form-urlencoded
REQUEST_URI=/system_cron_edit.php
GATEWAY_INTERFACE=CGI/1.1
HTTP_COOKIE=PHPSESSID=43734f3a004a091e6869984b68f9bfbe; GUID=jwqcoEUwUqb2chB5wxwl
SCRIPT_FILENAME=/usr/local/www/system_cron_edit.php
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Bon voila voila

Lesquelles doivent être rejoutées au script ? et comment ?

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 21:21
by ernie
Complément 2 :

J'ai trouvé : c'est l'emplacement.

La console considère l'emplacement dans le répertoire où s'exécute le script.

Cron met tout dans /usr/local/www

donc mon script ne trouvait pas les fichiers pour les commandes cp, rm et l'email.

Je corrige et je vous dis.

Re: Script : marche sous console, ne marche pas sous cron

Posted: 10 Feb 2015 21:39
by ernie
Eureka

J'ai modifié le script au niveau des commandes avec chemins par :

BODY="$(cat /usr/local/www/$monlog | sed 's/%/%%/g')"
mv /usr/local/www/$monlog /mnt/pool1/sup/rsync/

Et j'ai remplacé mes 2 commandes (cp puis rm par mv)

CQFD :)

Re: Script : marche sous console, ne marche pas sous cron

Posted: 11 Feb 2015 06:56
by ernie
Faux eurêka.

Le cron en exécution manuelle fonctionne bien:
Pas d erreur dans le log, le log explique que cela s est bien passé
Email avec le contenu du rapport reçu

Le cron en automatique à une heure précise ne marche pas:
Pas d erreur dans le log, même message que pour le manuel
Email vide

L environnement serait il différent ?

Re: Script : marche sous console, ne marche pas sous cron

Posted: 11 Feb 2015 16:39
by ernie
En lançant le script avec la commande env via le cron automatique j'ai :
LOGNAME=root
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
PWD=/var/log
HOME=/var/log
USER=root
SHELL=/bin/sh

donc environnement différent du cron en execution manuel. J avoue que c'est très pratique. :cry:

Peut on s'affranchir du chemin ? la variable HOME ne peut elle pas etre utilisée ?

Donc je vais change le répertoire de travial par /var/log , d'ailleurs j'y ai retrouvé le rapport rsync de cette nuit.

Attention ceci est valable pour Nayla 1310. Pas sur que cela soit pareil pour les autres versions de Nayla et de nas4free.

Re: Script : marche sous console, ne marche pas sous cron

Posted: 11 Feb 2015 17:00
by ernie
Hello

Cela marche en ecrivant en dur le chemin.

Mais vu que j'ai mis le chemin pour l'execution automatique, je ne peux plus executer manuellement.

J'ai testé ceci

BODY="$(cat $HOME/$monlog | sed 's/%/%%/g')"
mv $HOME/$monlog /mnt/pool1/sup/rsync/

Sans succès. Je cherche en parallèle de vos potentielles remarques/idées. :)

Re: Script : marche sous console, ne marche pas sous cron

Posted: 11 Feb 2015 17:51
by ernie
Apparemment cela serait plutot la variable PWD à utiliser:

PWD = /home/utilisateur/Desktop = Le répertoire de travail courant de l'interpréteur de commande.

Edit:

Et cela marche en mettant: $PWD au lieu de /var/log/

Script : marche sous console, ne marche pas sous cron

Posted: 28 Apr 2015 23:33
by ernie
Hello

Je relance ce post car j ai un soucis avec le cron et zrep.
Mon script se lance bien via une console, via exécuter maintenant dans cron.
Mais ne marche pas via le cron programme.

Ceci vient des variableś environnement. Zrep utilise une connexion ssh sécurisé et je suppose que dans le cas du cron programme il ne trouve pas les noms d hôtes ou/et les clés de sécurité.
Comment cela se paramètre t il en variable environnement ?
Merci par avance

Script : marche sous console, ne marche pas sous cron

Posted: 30 Apr 2015 09:09
by ernie
Hello,

Je tourne en rond et j'arrive pas à régler les variables d'environnement dans mon script.

Je pense qu'il faut ajouter cela:
SSH_CLIENT=adresseipsource unchiffre un port
SSH_CONNECTION=adresseipsource unchiffre adresseipdestination port
HOST=hostname1.local
REMOTEHOST=adresseipsource

1) Comment ajouter c'est variable au script ? Est ce une ligne telle que la suivant ?
HOST="hostname1.local"
Faut il enlever les guillemets ?

2) pour le point ssh, je ne sais pas ce qu'il faut mettre pour 'unchiffre'. A quoi cela correspond vu qu'à la fin il y a le port ?
Ce chiffre change t il à chaque connexion ?

Merci par avance

EDIT : resolu avec les variables d'environnement absente de zrep