[Risolto][Python] modificare crontab - lock file ?
Inviato: giovedì 10 gennaio 2019, 18:29
Ciao a tutto il forum.
Lo script1 (che ha i permessi da utente) prima di uscire aggiunge al crontab utente un job che lancerà il comando script2 unCertoParametro.
A volte ci sono istanze, più o meno contemporanee, dello script1 che aggiungono ciascuna il proprio job e quindi il crontab diventa di questo tipo
Lo script2, se non si verifica una certa condizione esce in silenzio per essere rieseguito dal crontab. Altrimenti, fatto il suo lavoro, prima di uscire cancella dal crontab il job che lo ha eseguito.
Ecco il problema:
a volte, senza che si sollevi nessun errore, nel crontab ritrovo delle righe residue, non cancellate.
Credo che questo si verifichi quando due diverse istanze di script2 tentano "contemporaneamente" di modificare il crontab.
Non saprei come riprodurre la cosa ma la posso simulare: apro due diversi terminali, eseguo in ciascuno il comando crontab -e faccio modifiche diverse e salvo. Quello che si verifica è che
# apparentemente non c'è un lock file, quando si salva non c'è alcun avviso di errore
# la versione di crontab che rimane è quella salvata per ultima
Scritta in bash, la cancellazione del job sarebbe:
il codice corrispondente nello script2 è:
Lo script2 usa già il modulo fcntl per creare dei File-Lock in altri casi ma qui non vedo come posso fare ad applicarlo
Qualsiasi suggerimento/sovvertimento è benvenuto, considerando comunque che il motivo per usare cron invece di un sistema pure Python è garantire la riesecuzione di script2 anche dopo un eventuale riavvio del pc
Grazie per l'attenzione fino a qui.
Lo script1 (che ha i permessi da utente) prima di uscire aggiunge al crontab utente un job che lancerà il comando script2 unCertoParametro.
A volte ci sono istanze, più o meno contemporanee, dello script1 che aggiungono ciascuna il proprio job e quindi il crontab diventa di questo tipo
Codice: Seleziona tutto
# ...
*/15 * * * * script2 parametro
*/15 * * * * script2 altroParametro
*/15 * * * * script2 parametroDiverso
# ...
Ecco il problema:
a volte, senza che si sollevi nessun errore, nel crontab ritrovo delle righe residue, non cancellate.
Credo che questo si verifichi quando due diverse istanze di script2 tentano "contemporaneamente" di modificare il crontab.
Non saprei come riprodurre la cosa ma la posso simulare: apro due diversi terminali, eseguo in ciascuno il comando crontab -e faccio modifiche diverse e salvo. Quello che si verifica è che
# apparentemente non c'è un lock file, quando si salva non c'è alcun avviso di errore
# la versione di crontab che rimane è quella salvata per ultima
Scritta in bash, la cancellazione del job sarebbe:
Codice: Seleziona tutto
crontab -l | grep -vF $suoParametro | crontab -
Codice: Seleziona tutto
import shlex
import subprocess
import sys
suoParametro = sys.argv[1]
p1 = subprocess.Popen(shlex.split("crontab -l"), stdout=subprocess.PIPE)
p2 = subprocess.Popen(shlex.split('grep -vF "%s"' %suoParametro),
stdin=p1.stdout,
stdout=subprocess.PIPE)
p1.stdout.close()
subprocess.Popen(shlex.split("crontab -"), stdin=p2.stdout)
Qualsiasi suggerimento/sovvertimento è benvenuto, considerando comunque che il motivo per usare cron invece di un sistema pure Python è garantire la riesecuzione di script2 anche dopo un eventuale riavvio del pc
Grazie per l'attenzione fino a qui.