2013-02-28 18 views
5

Ho uno script per elaborare i record in alcuni file, di solito ci vogliono 1-2 ore. Quando è in esecuzione, stampa un progresso del numero di record elaborati.Come faccio a sapere se uno script di bash è in esecuzione con nohup?

Ora, quello che voglio fare è: quando è in esecuzione con nohup, non voglio che stampi i progressi; dovrebbe stampare progressi solo quando viene eseguito manualmente.

La mia domanda è: come faccio a sapere se uno script di bash è in esecuzione con nohup?

Supponiamo che il comando sia nohup myscript.sh &. Nello script, come ottengo il numero nohup dalla riga di comando? Ho provato a usare $0, ma dà myscript.sh.

risposta

2

Si potrebbe verificare se STDOUT è associato a un terminale:

[ -t 1 ] 
+0

si prega di eleborare il downvote. grazie – lukuluku

+1

Si noti che questo controlla il terminale, non se è in esecuzione nohup. Se esegui 'myscript.sh> out.txt' anche questo controllo fallirà. (Non ti ho minimizzato) – johndodo

1

Un modo, ma non realmente portatile sarebbe di fare un readlink su /proc/$$/fd/1 e verificare se finisce con nohup.out.

Ma l'approccio tradizionale a tali problemi è quello di testare se l'uscita è un terminale:

[ -t 1 ] 
+0

Se esegui myscript.sh> out.txt questo controllo fallirà. – ndemou

0

Grazie ragazzi. Controlla STDOUT è una buona idea. Ho appena trovato un altro modo per farlo. Questo è per testare tty. test tty -s controlla il suo codice di ritorno. Se è 0, allora è in esecuzione su un terminale; se è 1 allora funziona con nohup.

+1

effettivamente, stai facendo esattamente la stessa cosa tty -s controlla se stdout è un terminale (vedi: http://ss64.com/bash/tty.html) e -t 1 è lo stesso (vedi: http: // www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions) – Sorin

3

Il controllo per il reindirizzamento dei file non è affidabile, poiché nohup può essere (e spesso è) utilizzato negli script in cui stdin, stdout e/o stderr sono già stati reindirizzati esplicitamente.

Oltre a queste redirezioni, l'unica cosa che fa è nohupignore the SIGHUP signal (grazie alla this guy per il link.)

Così, davvero quello che stiamo chiedendo è un modo per rilevare se SIGHUP viene ignorato. In Linux, la maschera ignora il segnale è esposta in /proc/$PID/status, in the least-significant bit of the SigIgn hex string.

A patto che conosciamo il pid dello script di bash che vogliamo controllare, possiamo usare egrep. Qui vedo se la shell corrente sta ignorando SIGHUP (cioè è "nohuppy"):

$ egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status && echo nohuppy || echo normal 
normal 
$ nohup bash -c 'egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status && echo nohuppy || echo normal'; cat nohup.out 
nohup: ignoring input and appending output to `nohup.out' 
nohuppy 
0

è possibile controllare se il pid genitore è 1:

if [ $PPID -eq 1 ] ; then 
    echo "Parent pid=1 (runing via nohup)" 
else 
    echo "Parent pid<>1 (NOT running via nohup)"            
fi 

o se lo script ignora il SIGHUP segnale (vedere https://stackoverflow.com/a/35638712/1011025):

if egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status ; then 
    echo "Ignores SIGHUP (runing via nohup)" 
else 
    echo "Doesn't ignore SIGHUP (NOT running via nohup)"            
fi