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

Hay*_*dnW 10 python background-process

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

sudo ./myscript.py
sudo ./myscript.py &
Run Code Online (Sandbox Code Playgroud)

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

sudo python myscript.py
sudo python myscript.py &
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bla*_*ack 6

基于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()
Run Code Online (Sandbox Code Playgroud)

  • 上面给出的例子在某种程度上完美地起作用.:)我实际上是在Linux上使用/etc/init.d中的脚本运行脚本,而不是通过终端.当我在终端提示符下启动Python脚本时,给出的示例非常出色,但是在通过init.d脚本运行时出现`OSError:[Errno 25]不合适的ioctl for device`.我会继续寻找!:) (2认同)
  • 将调用 `os.tcgetpgrp` 包裹在一个 try/except 块中,如果抛出一个 `OSError`,那么你就知道 `sys.stdout` 不是一个终端。在这种情况下,假设没有人能够阅读该消息可能是安全的。CTRL-C 可能也不起作用。 (2认同)