2013-02-28 161 views
5

我有一個腳本來處理某些文件中的記錄,通常需要1-2個小時。運行時,它會打印處理的記錄數量的進度。如何知道bash腳本是否正在運行nohup?

現在,我想要做的是:當它與nohup一起運行時,我不希望它打印進度;它應該只在手動運行時打印進度。

我的問題是如何知道bash腳本是否正在運行nohup

假設命令是nohup myscript.sh &。在腳本中,我如何從命令行獲取nohup?我試圖使用$0,但它給出myscript.sh

回答

2

如果stdout是與終端相關聯您可以檢查:

[ -t 1 ] 
+0

請給點意見吧。謝謝 – lukuluku 2014-06-26 12:39:43

+1

請注意,這檢查終端,而不是如果它在nohup下運行。如果你運行'myscript.sh> out.txt',這個檢查也會失敗。 (我沒有downvote你) – johndodo 2015-09-03 10:00:27

1

的一種方式,但不是真正的便攜式將做/proc/$$/fd/1和測試的readlink如果它的nohup.out結束。

但是傳統的方法來這樣的問題是測試輸出端子:

[ -t 1 ] 
+0

如果你運行myscript.sh> out.txt這個檢查將失敗。 – ndemou 2017-08-17 17:31:12

0

謝謝你們。檢查STDOUT是一個好主意。我只是找到另一種方式來做到這一點。那是測試tty。 test tty -s檢查它的返回碼。如果它是0,那麼它在終端上運行;如果它是1,那麼它運行nohup。

+1

實際上,您正在做同樣的事情tty -s檢查stdout是否是終端(請參閱:http://ss64.com/bash/tty.html)和-t 1是相同的(請參閱:http:// www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions) – Sorin 2013-03-05 21:40:53

3

檢查文件重定向不穩健,因爲nohup可以(並且經常)用於已經明確重定向stdin,stdout和/或stderr的腳本。

從這些重定向

除此之外,唯一nohup確實是ignore the SIGHUP signal(感謝this guy的鏈接。)

那麼,真的是我們要求的是檢測是否SIGHUP被忽略的一種方式。在linux中,信號忽略掩碼暴露在/proc/$PID/statusin the least-significant bit of the SigIgn hex string中。

假設我們知道我們想檢查的bash腳本的pid,我們可以使用egrep。在這裏我看到,如果當前shell無視SIGHUP(即是「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

您可以檢查父pid是1:

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

,或者如果你的腳本忽略SIGHUP信號(見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 
相關問題