Newsgroup: it.comp.os.linux.iniziare
Titolo: bash e tempi

Sto provando  questo script
 
if [ ! -e /home/io/programma.lock]; then
touch /home/io/programma.lock
esegui.programma
rm /home/io/programma.lock
fi
 
il rm viene eseguito dopo che esegui.programma ha finito ? 
oppure lo script va avanti senza aspettare la fine di 
esegui.programma ?

 "esegui.programma"
 
Dipende da "esegui.programma" e dallo script.
 
Per prima cosa, se usi "&" alla fine allora
shell non aspetta, "esegui.programma" viene
mandato in background e lo script prosegue.
Se invece non c'e` "&", dopo "esegui.programma",
allora, se il programma non si stacca per conto
proprio da shell, lo script aspetta fino alla
fine, altrimenti prosegue.
 
In ogni caso, potrebbe essere che tu abbia una
race condition.
 
Cosa succede se l'if e` negativo (niente lock),
perche` un altro script e` ancora tra l'if e
il touch?
 
Le due righe, "if" e "touch" non sono eseguite
in maniera atomica, per cui quello che potresti
voler fare, in realta` non funziona.
 
Sarebbe meglio usare "mkdir" invece di "touch" e
controllare il risultato *dopo*, non prima.
 
bye,
 
-- 
 
piergiorgio

Addi' 15 apr 2018 11:13:21, Piergiorgio Sartor scrive:

Scusa, chiedo per sapere (e magari puo' servire anche a P' o), ma
non conviene per sicurezza assoluta mettere && ad esempio cosi'?
touch /home/io/programma.lock && \
esegui.programma && \
rm /home/io/programma.lock
 
adesso, oltre ad aspettare certamente, esegue solo se sono Ok le
precedenti ciao
 
-- 
Yoda
 

 precedenti ciao
 
Da quello che leggo, la cosa migliore e` "mkdir",
perche` questo ritorna un errore nel caso in cui
la directory sia gia` presente.
Dovrebbe anche essere fatto in modo da essere un
test & make atomico. Sottolineo _dovrebbe_...
 
Quindi, forse meglio:
 
mkdir mylock && ( esegui.programma; rmdir mylock )
 
Oppure con l'if esplicito, che forse e` piu` leggibile.
 
if mkdir mylock
then
  esegui.programma
  rmdir mylock
else
  echo "LOCKED"
fi
 
bye,
 
-- 
 
piergiorgio

Addi' 15 apr 2018 12:25:01, Piergiorgio Sartor scrive:
 
--snip--
 
Grazie della risposta che mi studiero' con calma perche' capisco solo in
parte (e nel caso torno a chiedere) ciao!
 
-- 
Yoda
 

 risultato *dopo*, non prima.
 
grazie
 
inoltre a me non funziona
 
if [ ! -e /home/io/programma1.lock ]-a[ ! -e /home/io/
programma2.lock ]; then
(nb: tutto su una riga, qui non mi viene bene)
ecc
 
con -a = AND (OR sarebbe invece -o)
 
per farlo funzionare ho dovuto concatenare due if
 
if [ ! -e /home/io/programma1.lock]; then
 if [ ! -e /home/io/programma2.lock]; then
 
 
 
 

 con -a = AND (OR sarebbe invece -o)
 
In realta` sarebbe:
 
if [ ! -e .... -a ! -e ... ] ...
 
Cioe` deve essere un solo [ ... ], non due.
 
bye,
 
-- 
 
piergiorgio

 ecc
 
Forse manca qualche spazio.
Alle volte e` necessario separare (o non separare)
gli argomenti.
 
Tra l'altro, con due lock file bisogna stare ancora
piu` attenti ad evitare dead lock.
 
bye,
 
-- 
 
piergiorgio


Per il lock negli script usualmente si usa "filelock", un comando 
semplice semplice che trovai in rete e che si basa sulla system call link().
 
#!/bin/bash
 
tempfile=$(mktemp -p $TMP $PROG.$PID.XXXXXX)
lockfile="$TMP/.$PROG.lck"
 
trap 'rm $tempfile' EXIT
trap 'rm $lockfile; doReport; exit 1' HUP QUIT TERM
 
if filelock $tempfile $lockfile ; then
     esecuzione programma protetto
     rm $lockfile
else
     echo "il lock e` gia attivo"ZZ
fi
 
 
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >