Я использую следующую команду для запуска скрипта Python в фоновом режиме:
nohup ./cmd.py > cmd.log &
Но похоже, что nohup ничего не записывает в файл журнала. cmd.log создается, но всегда пуст. В скрипте python я использую sys.stdout.write
вместо print
вывода на стандартный вывод. Я что-то не так делаю?
nohup
вы используете? Версия BSD записывает в файл, вызываемыйnohup.out
в текущем каталоге (или$HOME/nohup.out
если текущий каталог не доступен для записи). Я не вижу способа изменить имя выходного файла ...Ответы:
Похоже, вам нужно периодически очищать stdout (например
sys.stdout.flush()
). В моем тестировании Python не делает этого автоматически дажеprint
до выхода из программы.источник
python -u
не работает;nohup
мог бы ввести собственную буферизацию.nohup
не буферизует вывод иpython -u
работает нормально. (просто обновление для людей)nohup
это утилита POSIX, которая может быть реализована по-разному на разных платформах. Кстати, ввод-вывод python3 больше не основан на C stdio, но имеет аналогичное поведение буферизации.Вы можете запустить Python с
-u
флагом, чтобы избежать буферизации вывода:источник
Использование
-u
withnohup
сработало для меня. Используя-u
будет принудительноstdout
,stderr
потоки , чтобы быть небуферизован. Это не повлияет на стандартный ввод. Все будет сохранено в файле nohup.out . Как это-Вы также можете сохранить его в своем каталоге. Сюда-
Также вы можете использовать
PYTHONUNBUFFERED
. Если вы установите его в непустую строку, он будет работать так же, как-u
опция. Для использования этой команды выполните следующие команды перед запуском кода Python.export PYTHONUNBUFFERED=1
или
export PYTHONUNBUFFERED=TRUE
PS - Я предлагаю использовать такие инструменты, как cron-job, для запуска вещей в фоновом режиме и выполнения по расписанию.
источник
export PYTHONUNBUFFERED=1 nohup ./cmd.py > cmd.log &
или
https://docs.python.org/2/using/cmdline.html#cmdoption-u
источник
Python 3.3 и выше имеет аргумент flush для печати, и это единственный метод, который у меня сработал.
print("number to train = " + str(num_train), flush=True) print("Using {} evaluation batches".format(num_evals), flush=True)
источник
У меня была аналогичная проблема, но не связанная с процессом Python. Я запускал скрипт, который выполнял nohup, и скрипт периодически запускался через cron.
Мне удалось решить проблему следующим образом:
PS: мои скрипты написаны на ksh, запущенном на RHEL
источник