GNU/Linux >> Linux Esercitazione >  >> Linux

fare in modo che un cronjob attenda il completamento del precedente lavoro rsync

Soluzione 1:

Puoi implementare un qualche tipo di blocco. Questo stamperà il numero di processi rsync ancora in esecuzione:

pgrep -cx rsync

E questo eseguirà rsync solo se non esiste nessun altro processo rsync:

pgrep -cx rsync || rsync ...

Utilizzando -x impedirà la corrispondenza accidentale di nomi indesiderati (ad esempio "foobarsync hronizator" o "not_an_rsync _totally" - funziona proprio come pgrep -c ^rsync$ )

Soluzione 2:

Puoi usare il comando flock per aiutarti a farlo, ad es. In questo caso flock -n è probabilmente quello che vuoi in quanto causerà un immediato fallimento del comando se non può ottenere il blocco, ad es.

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

Soluzione 3:

Ecco cosa farei. Crea uno script wrapper attorno a rsync per creare un file di blocco.

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

Soluzione 4:

Se sei disposto a prendere in considerazione altri strumenti, potresti anche dare un'occhiata a rdiff-backup. Utilizza librsync per eseguire i backup e salva un numero configurabile di delta/incrementi. Inoltre si blocca in modo che possa essere eseguito solo un processo rdiff-backup alla volta.

Soluzione 5:

La mia risposta è in qualche modo la stessa che ha detto Mike.

Nello script, dovresti inserire qualcosa del genere:

  • crea un file di blocco
  • Controlla l'esistenza del file di blocco quando lo esegui la prossima volta.

Ma c'è una cosa molto importante che dovresti fare. e quello per implementare un sistema di trappole.

Quindi, con questo, quello che puoi fare è che anche se in qualche modo il tuo script viene ucciso o qualcuno lo ha ucciso, allora puoi intercettare quel segnale e rimuovere il file di blocco, in modo da non avere un file di blocco obsoleto.

Puoi leggere come implementarlo qui.

Solo una piccola cosa, non puoi intercettare il segnale 9, voglio dire se qualcuno fa kill -9 , non puoi intercettarlo poiché quel segnale interagisce direttamente con il kernel e non c'è modo di intercettarlo.

Inoltre, come suggerito da John, devi rimuovere il file di blocco ogni volta che il sistema si riavvia, solo per assicurarti che non rimangano file obsoleti.

Puoi farlo facilmente inserendo un piccolo rm -f <FILE> comando in /etc/rc.local


Linux
  1. Fare `cut` Cambiare un file in posizione?

  2. Linux:come ottenere Sar da mostrare per il giorno precedente?

  3. Esiste una riga per verificare la presenza di file?

  4. Come utilizzare gli esempi di blocco Mutex C per la sincronizzazione dei thread di Linux

  5. Come rendere il file sparse?

Comando ls in Linux per elencare i file

Come rendere eseguibile un file in Linux

Trasferimenti di file più intelligenti rispetto a Rsync??

Stima il tempo o il lavoro rimasto per finire per Rsync?

Attendere il completamento del download di più file?

Rendi il file Bat disponibile ovunque per il terminale?