我有一个脚本来处理某些文件中的记录,通常需要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