2013-02-28 105 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 
相关问题