2013-02-28 11 views
5

Ich habe ein Skript, um Datensätze in einigen Dateien zu verarbeiten, dauert es normalerweise 1-2 Stunden. Wenn es ausgeführt wird, wird ein Fortschritt der Anzahl der verarbeiteten Datensätze ausgegeben.Woher weiß ich, ob ein Bash-Skript mit nohup läuft?

Nun, was ich tun möchte ist: Wenn es mit nohup läuft, will ich nicht, dass es den Fortschritt drucken; Es sollte den Fortschritt nur dann drucken, wenn es manuell ausgeführt wird.

Meine Frage ist, woher weiß ich, ob ein Bash-Skript mit nohup läuft?

Angenommen, der Befehl lautet nohup myscript.sh &. Wie bekomme ich in dem Skript die nohup von der Befehlszeile? Ich habe versucht, $0 zu verwenden, aber es gibt myscript.sh.

Antwort

2

Sie könnten überprüfen, ob STDOUT mit einem Terminal verbunden ist:

[ -t 1 ] 
+0

bitte den Downvote. danke – lukuluku

+1

Beachten Sie, dass dies das Terminal überprüfen, nicht wenn es unter nohup läuft. Wenn Sie 'myscript.sh> out.txt 'ausführen, wird diese Prüfung ebenfalls fehlschlagen. (Ich habe Sie nicht downvote) – johndodo

1

Ein Weg, aber nicht wirklich tragbar wäre, eine Readlink auf /proc/$$/fd/1 und Test zu tun, wenn es mit nohup.out endet.

Aber der traditionelle Ansatz, um solche Probleme zu testen, ob der Ausgang ein Terminal:

[ -t 1 ] 
+0

Wenn Sie meinscript.sh> out.txt ausführen, wird diese Prüfung fehlschlagen. – ndemou

0

Danke Jungs. Überprüfen Sie STDOUT ist eine gute Idee. Ich finde nur einen anderen Weg, es zu tun. Das ist tty zu testen. test tty -s überprüft seinen Rückgabecode. Wenn es 0 ist, dann läuft es auf einem Terminal; wenn es 1 ist, läuft es mit nohup.

+1

tatsächlich, Sie tun genau dasselbe tty -s überprüft, ob stdout ein Terminal ist (siehe: http://ss64.com/bash/tty.html) und -t 1 ist das gleiche (siehe: http: // www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions) – Sorin

3

Die Überprüfung auf Dateiumleitungen ist nicht robust, da nohup in Skripten verwendet werden kann (und oft verwendet wird), in denen stdin, stdout und/oder stderr bereits explizit umgeleitet werden.

Abgesehen von diesen Umleitungen, das einzige, was nohup tut, ist ignore the SIGHUP signal (dank this guy für den Link.)

Also, wirklich, was wir bitten ist ein Weg, um herauszufinden, ob SIGHUP ignoriert wird. In Linux ist die Signal-Ignoriermaske in /proc/$PID/status, in the least-significant bit of the SigIgn hex string offengelegt.

Vorausgesetzt, wir kennen die PID des Bash-Skripts, das wir überprüfen möchten, können wir egrep verwenden. Hier sehe ich, wenn die aktuelle Shell wird SIGHUP ignoriert (dh ist „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

Sie können entweder überprüfen, ob die Eltern pid 1:

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

oder wenn Ihr Skript ignoriert die SIGHUP Signal (siehe 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 
Verwandte Themen