python脚本如何知道自己在nohup模式下运行?
我在想我的python脚本如何知道自己在nohup模式下运行?,python,linux,command-line,args,nohup,Python,Linux,Command Line,Args,Nohup,我在想我的run.py脚本是否可以在两种不同的模式下运行。 在nohup模式下:nohup python run.py&,像完整日志输出模式一样。但在正常模式下python run.py,像日志抑制模式一样。因此,它将是整洁和清晰的用户 那么.我的问题是:我的可运行python脚本如何在nohup模式或正常模式下运行?nohup命令修改它启动的进程的操作系统级信号处理。这不会反映在命令的参数中,但进程可以查询自身以检查安装了哪些操作或信号处理程序。以下是如何做到这一点: import signa
run.py
脚本是否可以在两种不同的模式下运行。
在nohup模式下:nohup python run.py&
,像完整日志输出模式一样。但在正常模式下python run.py
,像日志抑制模式一样。因此,它将是整洁和清晰的用户
那么.我的问题是:我的可运行python脚本如何在nohup模式或正常模式下运行?nohup命令修改它启动的进程的操作系统级信号处理。这不会反映在命令的参数中,但进程可以查询自身以检查安装了哪些操作或信号处理程序。以下是如何做到这一点:
import signal
if signal.getsignal(signal.SIGHUP) == signal.SIG_DFL: # default action
print("No SIGHUP handler")
else:
print("In nohup mode")
这将适用于任何Unix系统,也可能适用于Windows(未经测试)。有其他方法可以从shell或程序内部设置信号处理程序,但是如果您只是试图区分
nohup
和正常调用,这将告诉您所有需要知道的信息。我已经尝试过sys.argv
,如果_uname_uu=''.u main_uuuu':print(sys.argv)
它只输出['run.py']
但是命令中的python
关键字nohup python run.py
之前没有任何内容。这在您的情况下有效吗?您的目标是什么操作系统?仅Unix?Linux还是OS X?@kennytm,nohup
将stdout重定向到文件,但脚本或命令行也可以这样做。检查stdout不是一种可靠的方法。@alexis sure.您的解决方案专门适用于nohup,而链接的解决方案适用于输出到非tty的任何内容。根据OP的需要,该解决方案可能更合适。检查是否设置为SIG_IGN可能更简单,否?当然,您可以更改细节以适合您,但我认为检查SIG_DFL
更健壮。nohup
在我的系统上会将其设置为SIG_IGN
,但谁知道它在其他地方会做什么呢?主要问题是默认处理程序(即无)已被重写。如果调用shell安装了具有trap
的处理程序函数,这是一种类似nohup
的情况,我的代码会注意到。可能需要指出的是,这并没有解决nohup
以较低的nice
优先级运行的副作用,或者OP的副作用(可能比较混乱)使用nohup
在后台运行的示例,这不是一个要求(您可以在没有nohup
的情况下在后台运行,nohup
并不严格要求您在后台运行作业,尽管在实践中不这样做很少有用)@tripleee,我刚刚回答了这个问题。这个问题问得很有道理,但你可能是对的。因此,警告OP:nohup
用于将进程后台化和注销。输出重定向和正常后台化作为特殊语法内置在shell中。@alexis:AFAIK,shell不能将其设置为任何其他内容,因为除了SIG\u IGN
将在exec()
上重置(这是有意义的,因为无论哪个信号处理程序存在,都不会出现在子进程中,并且您不希望有人使用外部设置的、可外部触发的信号处理程序来运行您的进程)。