如何检测Python脚本是否作为后台进程运行
有没有办法判断我的 Python 脚本是作为后台进程运行的,还是正常运行的呢?我想区分这两种情况:
sudo ./myscript.py
sudo ./myscript.py &
使用 sys.argv
这个方法不行,因为&符号似乎不算作一个参数。那么如果用下面的方式会有什么效果呢:
sudo python myscript.py
sudo python myscript.py &
我查了一下,但发现大家讨论的都是如何在 Python 脚本中启动一个后台进程,而不是判断这个 Python 脚本本身是否是后台进程。谢谢!
编辑:我的目的是输出一条信息(或者不输出),比如说如果正常启动,就显示 “按 Ctrl+C 停止这个脚本”,但如果是作为后台进程启动,就不显示这个信息。
编辑 2 我忘了提到,这个 Python 脚本是由 /etc/init.d
中的一个脚本启动的,而不是从终端命令行启动的。所以被标记为正确的答案确实回答了我提出的问题和提供的信息,但我想指出在 init.d
的情况下这个方法并不适用,以免将来造成混淆。
3 个回答
1
这个内容是基于一个来自这个回答的bash解决方案:
import os
import subprocess
pid = os.getpid()
if "+" in subprocess.check_output(["ps", "-o", "stat=", "-p", str(pid)]):
print "Running in foreground"
else:
print "Running in background"
2
我看到其他地方的解决方案,决定写一个纯 Python 的解决办法。这个方法是直接从 /proc/<pid>/stat
文件读取数据,而不是调用其他程序。
from os import getpid
with open("/proc/{}/stat".format(getpid())) as f:
data = f.read()
foreground_pid_of_group = data.rsplit(" ", 45)[1]
is_in_foreground = str(getpid()) == foreground_pid_of_group
关于 stat 文件中各列的含义,可以在 这里 找到相关信息。
8
根据C语言的一个回答,@AaronDigulla在评论中提到的内容:
import os
import sys
def main():
if os.getpgrp() == os.tcgetpgrp(sys.stdout.fileno()):
print 'Running in foreground.'
else:
print 'Running in background.'
if __name__ == '__main__':
main()