2014-09-16 2 views
1

J'ai une tâche à rsync un répertoire de serveur distantComment faire verrouillage de fichier avec bash

rsync -av [email protected]:/srv/data/ /srv/data/ 

Pour le faire fonctionner régulièrement et éviter Script problème « reenter », je crée un verrou de fichier « in_progress » avec pid de la progression de rsync, qui indique si le programme est toujours en cours d'exécution.

lock(){ 
    echo $1 > in_progress 
} 

Cette fonction de juger si les progrès de rsync est toujours en cours d'exécution:

is_running(){ 
    pid=$(cat in_progress) 
    return ps aux | awk '{print $2}' | grep $pid 
} 

je peux obtenir le pid de passer à fonctionner lock avec ce

$! 

j'avais mettre le fond de progression rsync pour obtenir le pid de rsync, donc je reçois ceci

rsync -av [email protected]:/srv/data/ /srv/data/ & 
lock $! 

mais lorsque les progrès de rsync est fait, je rm le fichier de verrouillage
J'ai essayé

rsync -av [email protected]:/srv/data/ /srv/data/ && rmLock & 
lock $! 

... il semble que le pid je suis arrivé est pas le pid du progrès rsync :-(

+0

double possible de [Comment empêcher un script exécution simultanée?] (Http://stackoverflow.com/questions/169964/how-to-prevent-a-script-from-running-simultanément) – Palec

+0

Il est bon d'indiquer que votre problème est résolu en acceptant une réponse utile. – klashxx

Répondre

0
(rsync -av [email protected]:/srv/data/ /srv/data/ && rmLock) & 

également

[ -d /proc/$pid ] && … 
+0

'(rsync -av [email protected]:/srv/data// srv/data/&& rmLock) &' semble ne pas avoir le pid de rsync, mais le bas pid démarre la commande – armnotstrong

0

je trouve un moyen de résoudre ce problème, en utilisant wait

rsync -av [email protected]:/srv/data/ /srv/data/ & 
pid=$! 
lock $pid 
wait $pid 
rmLock $pid 

grâce à tijagi, j'ai trouvé une façon plus élégante de juger si un progrès est en marche.

2

Si vous voulez éviter les exécutions simultanées, troupeau est un bel outil:

$ flock -n /path/to/lock/file -c "rsync -av [email protected]:/srv/data/ /srv/data/" & 
+0

Dumb me. Je pensais que le troupeau ne fonctionne que sur les fichiers. – tijagi

Questions connexes