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

时间:2014-07-21 09:08:32

标签: python background-process

有没有办法判断我的python脚本是否作为后台进程运行?我试图区分这两者:

sudo ./myscript.py
sudo ./myscript.py &

使用sys.argv不起作用 - &符号显然不算作参数。以下是对以下内容的影响:

sudo python myscript.py
sudo python myscript.py &

我已经浏览了一下,但一切似乎都是关于从Python脚本中启动后台进程,而不是Python脚本本身是否是后台进程。谢谢!

编辑:如果正常启动,目的是输出消息(或不输出) "Press Ctrl+C to stop this script",但如果启动则不显示消息作为后台进程。

编辑2 我忽略了提到这个python脚本将由一个脚本启动 /etc/init.d而不是终端提示。所以标记为正确的答案确实回答了我所说的问题以及给出的信息,但我想我应该指出它在init.d情景中不起作用,以避免任何可能的混淆。将来

3 个答案:

答案 0 :(得分:6)

基于the answer for 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()

答案 1 :(得分:1)

基于来自this的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 :(得分:0)

我在其他方面看到了其他解决方案,并决定编写一个纯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

可以找到统计文件列的含义here