我有一個腳本來處理某些文件中的記錄,通常需要1-2個小時。運行時,它會打印處理的記錄數量的進度。如何知道bash腳本是否正在運行nohup?
現在,我想要做的是:當它與nohup
一起運行時,我不希望它打印進度;它應該只在手動運行時打印進度。
我的問題是如何知道bash腳本是否正在運行nohup
?
假設命令是nohup myscript.sh &
。在腳本中,我如何從命令行獲取nohup
?我試圖使用$0
,但它給出myscript.sh
。
我有一個腳本來處理某些文件中的記錄,通常需要1-2個小時。運行時,它會打印處理的記錄數量的進度。如何知道bash腳本是否正在運行nohup?
現在,我想要做的是:當它與nohup
一起運行時,我不希望它打印進度;它應該只在手動運行時打印進度。
我的問題是如何知道bash腳本是否正在運行nohup
?
假設命令是nohup myscript.sh &
。在腳本中,我如何從命令行獲取nohup
?我試圖使用$0
,但它給出myscript.sh
。
如果stdout是與終端相關聯您可以檢查:
[ -t 1 ]
的一種方式,但不是真正的便攜式將做/proc/$$/fd/1
和測試的readlink如果它的nohup.out結束。
但是傳統的方法來這樣的問題是測試輸出端子:
[ -t 1 ]
如果你運行myscript.sh> out.txt這個檢查將失敗。 – ndemou 2017-08-17 17:31:12
謝謝你們。檢查STDOUT是一個好主意。我只是找到另一種方式來做到這一點。那是測試tty。 test tty -s檢查它的返回碼。如果它是0,那麼它在終端上運行;如果它是1,那麼它運行nohup。
實際上,您正在做同樣的事情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
檢查文件重定向不穩健,因爲nohup
可以(並且經常)用於已經明確重定向stdin,stdout和/或stderr的腳本。
除此之外,唯一nohup
確實是ignore the SIGHUP
signal(感謝this guy的鏈接。)
那麼,真的是我們要求的是檢測是否SIGHUP
被忽略的一種方式。在linux中,信號忽略掩碼暴露在/proc/$PID/status
,in 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
您可以檢查父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
請給點意見吧。謝謝 – lukuluku 2014-06-26 12:39:43
請注意,這檢查終端,而不是如果它在nohup下運行。如果你運行'myscript.sh> out.txt',這個檢查也會失敗。 (我沒有downvote你) – johndodo 2015-09-03 10:00:27