#1 Le 29/09/2014, à 18:18
- cmathias
Script bash + cron éviter une multiplication des processus
Bonjour à tous,
Chez moi j'ai un serveur qui sauvegarde automatiquement les données de mon serveur internet, pour avoir une tache automatique j'utilise un fichier bash avec cron. Le souci c'est que si la sauvegarde n'est pas fini cron va quand même relancer la tache.
Au bout d'un moment je peut avoir des dizaines de processus de lftp en cours limitant les performances de mes serveurs.
Existe t'il un moyen simple pour éviter ce genre de désagrément ?
Merci
Hors ligne
#2 Le 29/09/2014, à 18:37
- jplemoine
Re : Script bash + cron éviter une multiplication des processus
oui. il faut utiliser un fichier dans /var/run (par exemple sauve.pid)
En début de script :
on teste la présence du fichier
il existe, on sort
il n'existe pas, on le crée
En fin de script, on efface le fichier
Dans une version 2, on peut tester l'age du fichier (en cas de plantage)
Dernière modification par jplemoine (Le 29/09/2014, à 18:37)
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#3 Le 29/09/2014, à 18:40
- Junkaria
Re : Script bash + cron éviter une multiplication des processus
Ce que tu peux faire c'est récupérer le pid de la sauvegarde, et agir en fonction de son état
Ensuite une chose à faire c'est voir le temps d’exécution des deux scripts pour optimiser la chose pour par exemple :
> ta sauvegarde se termine
> ton script se lance
> une autre instance de sauvegarde se lance avant la fin de ton script.
Après je ne sais pas comment fonctionnent tes process mais c'est un conseil de plus
EDIT :Désolé j'ai lu trop vite ton topic (et je mate la télé en même temps ça aide pas ^^).
En fait tu as qu'un seul script bash qui lui lance la sauvegarde c'est bien ça ?
Dernière modification par Junkaria (Le 29/09/2014, à 19:13)
Ubuntu 08.04-11.04 | Linux Mint | ArchLinux
Hors ligne
#4 Le 29/09/2014, à 18:46
- jplemoine
Re : Script bash + cron éviter une multiplication des processus
La solution que j'ai proposée est, je pense, celle qui est employée par beaucoup de "logiciels".
Dernière modification par jplemoine (Le 29/09/2014, à 18:46)
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#5 Le 29/09/2014, à 18:53
- cmathias
Re : Script bash + cron éviter une multiplication des processus
Merci pour vos réponses,
jplemoine ta solution me semble plus approprié, est t'il possible de m'aider à la mettre en place ? je ne suis pas un expert dans le domaine de linux...
Merci
Hors ligne
#6 Le 29/09/2014, à 19:15
- jplemoine
Re : Script bash + cron éviter une multiplication des processus
Je ne suis pas très bon en bash mais en gros :
Attention : /var/run n'est accessible que par root
Donc, si tu le lances par un utilisateur "normal", il le faut mettre un répertoire accessible à tous
pid pointe sur le fichier qui sert d'indicateur
#pid="/var/run/sauve.pid"
pid="/home/xxxx/sauve.pid"
if [ -e $pid ]; then
echo "proc en cours"
exit
else
# on crée le pid
touch $pid
fi
# là tu mets ta sauvegarde
echo "on simule"
read toto
# fin simulation
rm $pid
Dernière modification par jplemoine (Le 29/09/2014, à 19:16)
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#7 Le 29/09/2014, à 20:16
- cmathias
Re : Script bash + cron éviter une multiplication des processus
J'ai trouvé ce script sur internet, il ressemble beaucoup à ton idée.
#!/bin/bash
if [ -f /var/run/$0.pid ] ; then
echo "Une autre occurence tourne" >> /var/log/$0.log
exit 1
fi
touch /var/run/$0.pid
if [ $? -ne 0 ] ; then
echo "impossible de cree le fichier /var/run/$0.pid" >> /var/log/$0.log
exit 2
fi
LOG_FILE="/opt/duplication.log"
HOST="*****"
USER="*****"
PASSWORD="*****"
REP_LOCAL="*******"
REP_DISTANT="*******"
# backup de dossiers
lftp ftp://$USER:$PASSWORD@$HOST -e "set net:connection-limit 1; set net:limit-rate 512000:0; set set file:charset utf8; set ftp:charset utf8; mirror -c $REP_DISTANT $REP_LOCAL ; quit" > $LOG_FILE 2>
#fin de script :
rm -f /var/run.$0.pid
exit 0
Il à l'air de fonctionner, par contre j'ai tester de le lancer 2 fois à partir de deux consoles et j'ai pas eu de message d'erreur.
Merci
Dernière modification par cmathias (Le 29/09/2014, à 20:37)
Hors ligne
#8 Le 29/09/2014, à 20:21
- pingouinux
Re : Script bash + cron éviter une multiplication des processus
Salut,
C'est parce que la variable LOG_FILE n'est pas définie. Il y a aussi une erreur sur l'avant-dernière ligne du script.
Hors ligne
#9 Le 29/09/2014, à 20:21
- jplemoine
Re : Script bash + cron éviter une multiplication des processus
Mets des guillemets dans l'affectation
LOG_FILE="/opt/duplication.log"
et dans la longue ligne
$LOG_FILE 2>
sans les accolades
Ce compte ne servira plus : vous pouvez le supprimer si le coeur vous en dit...
Laissé par l'auteur pour historique.
Hors ligne
#10 Le 29/09/2014, à 20:35
- cmathias
Re : Script bash + cron éviter une multiplication des processus
Oula nos messages ce sont croisé, en fait en envoyant le post j'ai compris mon erreur et j'ai édité de suite.
la il à l'air de tourner, si je le relance le script n'a pas l'air de s’exécuter mais j'ai pas le message de echo comme quoi le script est déjà en cours... ?
Hors ligne
#11 Le 29/09/2014, à 20:37
- pingouinux
Re : Script bash + cron éviter une multiplication des processus
@cmathias :
Tu as modifié ton message #7 après ma réponse #8, sans le préciser. Ceux qui liront cette discussion par la suite risquent de ne pas comprendre.
@jplemoine :
Pour info, ces 2 commandes sont équivalentes
LOG_FILE=/opt/duplication.log
et
LOG_FILE="/opt/duplication.log"
Les " " ne sont indispensables que si la chaîne contient des espaces ou des caractères bizarres
De même, $LOG_FILE est équivalent à ${LOG_FILE}. Les accolades sont cependant indispensables dans cet exemple fichier=${LOG_FILE}_suffixe.log
Correction : Orthographe
Dernière modification par pingouinux (Le 29/09/2014, à 20:48)
Hors ligne
#12 Le 29/09/2014, à 20:40
- cmathias
Re : Script bash + cron éviter une multiplication des processus
Oui faite je penser pas avoir une réponse aussi rapide et j'ai pas rafraîchi avant d'éditer
je vais laisser le script tourner voir si il me créer encore des multi processus.
Hors ligne
#13 Le 30/09/2014, à 18:08
- cmathias
Re : Script bash + cron éviter une multiplication des processus
Bonjour à tous,
Le script ne s’exécute plus. Je le lance avec ./ et il ne fait plus rien, il à fonctionné 1 fois hier (premier lancement)
J'ai aucun message, rien, je lance ma commande rien ne se passe.
Des idées ?
merci
EDIT : Bon j'ai réussi à rétablir le script, une petite faute de frappe de ma part.
Par contre je ne peut pas le lancer plus d'une fois, je doit redémarrer le serveur pour le relancer. J'ai l'impression que le script ne fonctionne pas totalement, certainement au niveau de la gestion du PID ?
EDIT 2 : Je confirme c'est au niveau du PID que ça déconne, il ne s'efface pas. une idée d'ou peut venir le problème ?
EDIT 3 : Après relecture du script et suppression du -f de rm j'ai ce message "rm: cannot remove ‘/var/run../duplicationL.sh.pid’: No such file or directory"
du coup je pense que
rm /var/run.$0.pid
$0.pid retourne ce résultat './duplicationL.sh"
Comment virer le ./ de duplication ?
EDIT 4 : bon j'ai réglé mon soucis en mettant le lien direct dans le rm
rm -f /var/run/duplicationL.sh.pid
Par contre et par curiosité pourquoi le $0 retourne ./duplicationL.sh et non pas duplicationL.sh simplement ?
Dernière modification par cmathias (Le 30/09/2014, à 21:45)
Hors ligne
#14 Le 01/10/2014, à 16:33
- cmathias
Re : Script bash + cron éviter une multiplication des processus
Je reviens vers vous à cause de mon crontab ce coup ci...
Le script fonctionne parfaitement, aucun soucis pour l’exécuter manuellement. Par contre mon cron ne lance pas le script.
Mon cron :
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
0 9,10,11,12,13,14,15,16,17,18,19,20,21,22 * * * root /opt/duplicationL.sh
0 23,0,1,2,3,4,5,6,7,8 * * * root /opt/duplication2.sh
#
Mon code :
#!/bin/sh
if [ -f /var/run/$0.pid ] ; then
echo "Une autre occurence tourne" >> /var/log/$0.log
exit 1
fi
touch /var/run/$0.pid
if [ $? -ne 0 ] ; then
echo "impossible de cree le fichier /var/run/$0.pid" >> /var/log/$0.log
exit 2
fi
LOG_FILE="/opt/duplication.log"
HOST=""
USER=""
PASSWORD=""
REP_LOCAL=""
REP_DISTANT=""
# backup de dossiers
lftp ftp://$USER:$PASSWORD@$HOST -e "set net:connection-limit 1; set net:limit-rate 512000:0; set set file:charset$
#fin de script :
rm /var/run/duplicationL.sh.pid
exit 0
J'ai fait une erreur quelques part ?
Merci
Dernière modification par cmathias (Le 01/10/2014, à 16:35)
Hors ligne
#15 Le 01/10/2014, à 18:02
- Junkaria
Re : Script bash + cron éviter une multiplication des processus
ALERTE Edite vite ton code...
Tes logins sont présents !!
EDIT: ah tu l'as modifié... mais change ton mdp car perso je l'ai reçu sur le mail de notif
Dernière modification par Junkaria (Le 01/10/2014, à 18:05)
Ubuntu 08.04-11.04 | Linux Mint | ArchLinux
Hors ligne
#16 Le 01/10/2014, à 20:35
- cmathias
Re : Script bash + cron éviter une multiplication des processus
J'ai changer le mot de passe quand j'ai vu mon erreur.
Sinon j'ai regardé les logs et dans syslog je trouve sa :
$ Oct 1 21:00:01 cmathias-MS-7808 CRON[24065]: (root) CMD (/opt/duplicationL.sh)
Pas d'erreur particulière..
Hors ligne