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

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

nohup ./cmd.py > cmd.log &

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

 John Kugelman16 окт. 2012 г., 19:11
@wulong That 'только если stdout является терминалом.
 user164251316 окт. 2012 г., 19:17
Я также попробовал команду без перенаправления, и это неСоздать файл nohup.out вообще. Я неЯ не знаю, какой это вариант, но я использую SunOS 5.10, если это поможет.
 wulong16 окт. 2012 г., 19:10
Какой вариантnohup ты используешь? Версия BSD записывает в файл с именемnohup.out в текущем каталоге (или$HOME/nohup.out если текущий каталог не 'т для записи). Я неНе вижу способа изменить имя выходного файла ...

Ответы на вопрос(6)

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

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
Решение Вопроса

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

 user164251316 окт. 2012 г., 19:25
Благодарю. Это работает.
 Pijusn19 нояб. 2014 г., 09:31
@ J.F.Sebastian На сегодняшний деньnohup Безразлично»выходной буфер иpython -u работает просто отлично. (просто обновление для людей)
 jfs01 дек. 2014 г., 17:30
@Пий:nohup такое утилита POSIX на разных платформах могут быть разные реализации. Кстати, ввод / вывод python3 больше не основывается на C stdio, но имеет похожее поведение буферизации.
 jfs16 окт. 2012 г., 19:37
Python, как и другие программы на основе C-stdio, использует буферизацию строк в интерактивном случае (stdout подключен к tty) и буферизацию блоков при перенаправлении в файл. Еслиpython -u Безразлично»т работа;nohup возможно, ввел свою собственную буферизацию.

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

nohup python -u ./cmd.py > cmd.log &
 Sadjad24 июн. 2014 г., 21:54
Это лучше! Большое спасибо :)
 vz010 дек. 2014 г., 10:58
@kommradHomer Полагаю, это зависит от количества выводимых данных на stdout / stderr, который создает ваша программа.
 Ondrej Burkert13 мая 2015 г., 16:50
Работает как шарм. Я также думаю, что это лучший ответ, чем тот, который был выбран как правильный. Не могли бы вы отметить это как правильный, чтобы не запутать других?
 kommradHomer10 дек. 2014 г., 10:53
это будет проблемой производительности?
 Basj12 янв. 2016 г., 22:41
Предупреждение: этоБезразлично»т всегда работать, Я нене знаю почему. Вы?
 krinker08 февр. 2017 г., 22:35
это должен быть принятый ответ ... сделал то, что я хотел. Спасибо!
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &

или же

nohup python -u ./cmd.py > cmd.log &

https://docs.python.org/2/using/cmdline.html#cmdoption-u

С помощью '-u» с 'поЬир» работал на меня. Все будет сохранено вnohup.out " файл. Как это-

nohup python -u code.py &
 Overcode24 янв. 2018 г., 16:21
@ Deqing нет никакой разницы.
 Deqing04 дек. 2017 г., 01:13
Какие'Разница с ответом от @ vz0?

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

Я смог решить проблему путем:

перенаправление stdin, stdout и stderrобеспечение того, чтобы скрипт вызывался через nohup didn 'не запускать что-либо еще в фоновом режиме

PS: мои скрипты были написаны на ksh, работающем на RHEL

Ваш ответ на вопрос