Как скрипт python узнает, что он работает в режиме nohup?

Я думаю, может ли мой run.py скрипт работать в двух разных режимах. в режиме nohup: nohup python run.py & действует как режим вывода полного журнала. но в нормальном режиме python run.py действует как режим подавления журнала. Так пользователю будет аккуратно и понятно.

Итак, мой вопрос: как мой исполняемый скрипт python знает, что он работает в режиме nohup или в обычном режиме?


person naughty fox    schedule 08.03.2017    source источник
comment
Я уже пробовал sys.argv, if __name__ == '__main__': print(sys.argv) выводит только ['run.py'], но ничего перед ключевым словом python в команде nohup python run.py.   -  person naughty fox    schedule 08.03.2017
comment
Это работает в вашем случае? stackoverflow.com/questions/858623/   -  person kennytm    schedule 08.03.2017
comment
На какую ОС вы ориентируетесь? Только Unix? Linux или OS X?   -  person alexis    schedule 08.03.2017
comment
@kennytm, nohup перенаправляет стандартный вывод в файл, но обычно это делают и сценарии, и командные строки. Проверка стандартного вывода не является надежным методом.   -  person alexis    schedule 08.03.2017
comment
@alexis Конечно. Ваше решение работает специально для nohup, в то время как связанное решение работает для всего, что выводится на не-tty. В зависимости от того, что хочет OP, это может быть более подходящим.   -  person kennytm    schedule 08.03.2017
comment
@alexis Я использую CentOS7 /bash/python3.5. это действительно отличный ответ для работы с сигналом Linux.   -  person naughty fox    schedule 08.03.2017


Ответы (1)


Команда nohup изменяет обработку сигналов на уровне ОС для процесса, который она запускает. Это не отражается в аргументах команды, но процесс может запросить сам, чтобы проверить, какие действия или обработчики сигналов установлены. Вот как это сделать:

import signal

if signal.getsignal(signal.SIGHUP) == signal.SIG_DFL:  # default action
    print("No SIGHUP handler")
else:
    print("In nohup mode")

Это будет работать в любой системе Unix и, возможно, в Windows (не тестировалось). Есть и другие способы установить обработчик сигнала из оболочки или из программы, но если вы просто пытаетесь отличить nohup от обычного вызова, это расскажет вам все, что вам нужно знать.

person alexis    schedule 08.03.2017
comment
Возможно, было бы проще проверить, установлен ли он на SIG_IGN, нет? - person Hasturkun; 08.03.2017
comment
Конечно, вы можете изменить детали по своему усмотрению, но я думаю, что проверка SIG_DFL более надежна. nohup в моей системе установит его на SIG_IGN, но кто знает, что он делает в другом месте? Главный вопрос заключается в том, был ли переопределен обработчик по умолчанию (т.е. нет). Если вызывающая оболочка установила функцию-обработчик с trap, это ситуация, похожая на nohup, и мой код это заметит. - person alexis; 08.03.2017
comment
Может быть, укажите, что это не устраняет побочный эффект nohup для запуска с более низким nice приоритетом или пример OP (возможно, запутанный) работы в фоновом режиме с nohup, что не является обязательным (вы можете работать в фоновом режиме без nohup и nohup не требует строгого выполнения задания в фоновом режиме, хотя на практике этого редко бывает полезно). - person tripleee; 08.03.2017
comment
@tripleee, я только что ответил на вопрос. Это имеет смысл, как и просили, но вы могли быть правы. Так что предостережение OP: nohup предназначено для фонового запуска процесса и выхода из системы. Перенаправление вывода и нормальный фон встроены в оболочку в виде специального синтаксиса. - person alexis; 08.03.2017
comment
@alexis: AFAIK, оболочка не может установить для него что-либо еще, поскольку все, кроме SIG_IGN, будет сброшено на exec() (что имеет смысл, поскольку какой бы обработчик сигнала там не присутствовал в дочернем элементе, и вы не я не хочу, чтобы кто-то запускал ваш процесс с внешне установленным, запускаемым извне обработчиком сигнала). - person Hasturkun; 08.03.2017
comment
@Hasturkun, ты прав. (Игнорирование сигнала может быть передано, если вызывающая оболочка была вызвана с уже проигнорированным сигналом, но перехват функции - нет.) Тем не менее, я думал, что проверка отклонения от поведения по умолчанию - самый безопасный подход. - person alexis; 09.03.2017