2012-06-28 6 views
7

ho il seguente script bash, si può chiamare script1.sh:Come verificare se un lavoro in background è vivo? (Bash)

#!/bin/bash 

exec ./script2.sh & 

sleep 5 

if job1 is alive then #<--- this line is pseudo-code! 
    exec ./script3.sh & 
    wait 
fi 

Come si può vedere, lo script viene eseguito script2.sh come processo in background e quindi attende 5 secondi (in modo script2.sh può fare un po 'di inizializzazione cose). Se l'inizializzazione ha esito positivo, il lavoro script2.sh sarà ancora attivo, nel qual caso voglio anche avviare script3.sh contemporaneamente; se no, voglio solo smettere.

Tuttavia, non so come controllare se il primo lavoro è attivo, quindi la riga di pseudo-codice. Quindi, cosa dovrebbe andare al suo posto?

+2

L'esecuzione di exec non farà ciò che si pensa. Sostituirà il processo corrente con un nuovo processo; le linee successive nel tuo script non saranno raggiunte. –

risposta

9

È possibile ottenere il PID del lavoro in background più recente con $!. È quindi possibile verificare lo stato di uscita di ps per determinare se quel particolare PID è ancora presente nell'elenco dei processi. Per esempio:

sleep 30 & 
if ps -p $! >&-; then 
    wait $! 
else 
    jobs 
fi 
+2

Quel comando esatto mi dà l'errore ps: errore di scrittura: Bad Filedescriptor – FORTRAN

+0

Questo non sempre funziona. Ad esempio, in Alpine Linux, il valore predefinito "ps" è associato a BusyBox, che non supporta l'opzione -p. L'uso di 'bash' come" lavori "è più portabile. –

3

Non sono sicuro exec funziona con lo sfondo, in quanto sostituisce l'immagine del processo padre con quella del processo figlio, in caso contrario, se si assume a sbarazzarsi di exec, che ci si vuole qualcosa di simile:

#!/bin/bash 
./script2.sh& 
pid1=$! 

if kill -0 $pid1; then 
    ./script3.sh& 
    pid3=$! 
    wait 
fi 
6

è possibile verificare se un segnale è consegnabile

./script2 & 
myPid=$! 
sleep 5 

if kill -0 "$myPid"; then 
    script3 & 
    wait 
fi 
0

Date un'occhiata al comando jobs; elenca tutti i lavori in corso.

4

Per espandere sulla risposta fduff è possibile utilizzare il jobs integrato:

if jobs %% 
    exec ./script3.sh & 
    wait 
fi 

jobs %% stampe l'ID del processo del più recente processo in background (il "lavoro in corso") e restituisce 0 in caso di successo o 1 se non c'è un lavoro simile.