Как определить, выполняется ли скрипт python в качестве фонового процесса

есть ли способ узнать, работает ли мой скрипт python в качестве фонового процесса или нет? Я пытаюсь провести различие между этими двумя:

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

используя sys.argv не работает-амперсанд, по-видимому, не считается аргументом. И каков был бы эффект от следующего:--7-->

sudo python myscript.py
sudo python myscript.py &

я осмотрелся, но все, похоже, связано с запуском фонового процесса из скрипта Python, а не с самим скриптом Python это фоновый процесс. Спасибо!

EDIT: цель состоит в том, чтобы вывести сообщение (или нет), то есть "Press Ctrl+C to stop this script" Если запущен нормально, но не отображать сообщение, если запущен в качестве фонового процесса.

правка 2 я забыл упомянуть, что этот скрипт python будет запущен скриптом в /etc/init.d, а не от терминала. Таким образом, ответ, отмеченный как правильный, действительно отвечает на вопрос, как я сформулировал его и с помощью информация предоставлена, но я подумал, что должен указать, что она не работает в init.d сценарий, чтобы избежать любой потенциальной путаницы в будущем.

3 ответов


на основе ответ для 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()

на основе решения 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"

Я видел другие решения на других и решил написать чистое решение 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

значения столбцов файла статистики можно найти здесь