我如何知道bash脚本是否与nohup一起运行?

Gar*_*ary 8 linux bash shell nohup

我有一个脚本来处理某些文件中的记录,通常需要1-2个小时.当它运行时,它会打印处理的记录数量的进度.

现在,我想要做的是:当它运行时nohup,我不希望它打印进度; 它应该只在手动运行时打印进度.

我的问题是如何知道bash脚本是否正在运行nohup

假设命令是nohup myscript.sh &.在脚本中,如何nohup从命令行获取?我尝试使用$0,但它给了myscript.sh.

phs*_*phs 9

检查文件重定向是不健全的,因为nohup可以(并且经常)在stdin,stdout和/或stderr已经明确重定向的脚本中使用.

除了这些重定向之外,唯一nohup能做的就是忽略SIGHUP信号(感谢Blrfl的链接.)

所以,我们真正要求的是一种检测是否SIGHUP被忽略的方法.在Linux中,信号忽略掩模被暴露于/proc/$PID/status,在结果的最低位显著SigIgn十六进制字符串.

如果我们知道要检查的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
Run Code Online (Sandbox Code Playgroud)


luk*_*uku 1

您可以检查 STDOUT 是否与终端关联:

[ -t 1 ]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会检查终端,而不是检查终端是否在 nohup 下运行。如果您运行“myscript.sh > out.txt”,此检查也会失败。(我没有给你投反对票) (4认同)