Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python脚本如何知道自己在nohup模式下运行?_Python_Linux_Command Line_Args_Nohup - Fatal编程技术网

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()
上重置(这是有意义的,因为无论哪个信号处理程序存在,都不会出现在子进程中,并且您不希望有人使用外部设置的、可外部触发的信号处理程序来运行您的进程)。