如何检测Python脚本是否作为后台进程运行

14 投票
3 回答
7051 浏览
提问于 2025-04-18 14:05

有没有办法判断我的 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()

撰写回答