Nohup не записывает журнал в выходной файл

145

Я использую следующую команду для запуска скрипта Python в фоновом режиме:

nohup ./cmd.py > cmd.log &

Но похоже, что nohup ничего не записывает в файл журнала. cmd.log создается, но всегда пуст. В скрипте python я использую sys.stdout.writeвместо printвывода на стандартный вывод. Я что-то не так делаю?


источник
Какой вариант nohupвы используете? Версия BSD записывает в файл, вызываемый nohup.outв текущем каталоге (или $HOME/nohup.outесли текущий каталог не доступен для записи). Я не вижу способа изменить имя выходного файла ...
wulong
@wulong Это только если stdout является терминалом.
Джон Кугельман
Я также попробовал команду без перенаправления, и она вообще не создавала файл nohup.out. Я не знаю, какой это вариант, но я использую SunOS 5.10, если это поможет.

Ответы:

104

Похоже, вам нужно периодически очищать stdout (например sys.stdout.flush()). В моем тестировании Python не делает этого автоматически даже printдо выхода из программы.

Wulong
источник
18
python, а также другие программы на основе C stdio используют буферизацию строк в интерактивном случае (stdout подключен к tty) и блочную буферизацию при перенаправлении в файл. Если python -uне работает; nohupмог бы ввести собственную буферизацию.
jfs
13
@JFSebastian На сегодняшний день nohupне буферизует вывод и python -uработает нормально. (просто обновление для людей)
Pijusn
1
@Pius: nohupэто утилита POSIX, которая может быть реализована по-разному на разных платформах. Кстати, ввод-вывод python3 больше не основан на C stdio, но имеет аналогичное поведение буферизации.
jfs
402

Вы можете запустить Python с -uфлагом, чтобы избежать буферизации вывода:

nohup python -u ./cmd.py > cmd.log &
vz0
источник
13
Это лучше! Большое спасибо :)
Sadjad
@kommradHomer Я думаю, это зависит от объема вывода на stdout / stderr, который производит ваша программа.
vz0
1
Работает как шарм. Я также считаю, что это лучший ответ, чем тот, который был выбран как правильный. Не могли бы вы отметить это как правильное, чтобы не путать других?
Ондрей Буркерт
1
Предупреждение: это не всегда работает . Не знаю почему. Вы?
Basj
3
это должен быть принятый ответ ... сделал то, что хотел. Благодарность!
krinker
46
  • Использование -u with nohupсработало для меня. Используя -uбудет принудительно stdout, stderrпотоки , чтобы быть небуферизован. Это не повлияет на стандартный ввод. Все будет сохранено в файле nohup.out . Как это-

    nohup python -u your_code.py &
    

    Вы также можете сохранить его в своем каталоге. Сюда-

    nohup python -u your_code.py > your_directory/nohup.out &
    
  • Также вы можете использовать PYTHONUNBUFFERED. Если вы установите его в непустую строку, он будет работать так же, как -uопция. Для использования этой команды выполните следующие команды перед запуском кода Python.

    export PYTHONUNBUFFERED=1
    

    или

    export PYTHONUNBUFFERED=TRUE
    

PS - Я предлагаю использовать такие инструменты, как cron-job, для запуска вещей в фоновом режиме и выполнения по расписанию.

Нурул Актер Таухид
источник
Чем отличается ответ от @ vz0?
Deqing
1
@Deqing нет разницы.
Overcode
2

Python 3.3 и выше имеет аргумент flush для печати, и это единственный метод, который у меня сработал.

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
Ганеш Кришнан
источник
0

У меня была аналогичная проблема, но не связанная с процессом Python. Я запускал скрипт, который выполнял nohup, и скрипт периодически запускался через cron.

Мне удалось решить проблему следующим образом:

  1. перенаправление stdin, stdout и stderr
  2. обеспечение того, чтобы сценарий, вызываемый через nohup, не запускал ничего в фоновом режиме

PS: мои скрипты написаны на ksh, запущенном на RHEL

Прадип Анчан
источник