Nohup не записує журнал у вихідний файл


141

Я використовую таку команду для запуску сценарію 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, якщо це допомагає.

Відповіді:


103

Схоже, вам потрібно періодично промивати stdout (наприклад sys.stdout.flush()). У моєму тестуванні Python не робить цього автоматично навіть до printтих пір, поки програма не вийде.


17
python, як і інші програми, засновані на stdio, використовує буферизацію рядків у інтерактивному випадку (stdout підключений до tty) та блокування буферизацією, коли перенаправлено на файл. Якщо python -uне працює; nohupможливо, ввела власну буферизацію.
jfs

12
@JFSebastian На сьогоднішній день nohupне буферний вихід і python -uпрацює просто чудово. (лише оновлення для людей)
Pijusn

1
@Pius: nohupце утиліта POSIX, на різних платформах можуть бути різні реалізації. btw, python3 I / O більше не базується на C stdio, але має подібну буферну поведінку.
jfs

382

Ви можете запустити Python -uпрапором, щоб уникнути буферизації виводу:

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

12
Це краще! Велике спасибі :)
Саджад

@kommradHomer Я думаю, це залежить від обсягу виходу на stdout / stderr, який виробляє ваша програма.
vz0

1
Працює як шарм. Я також вважаю, що це краща відповідь, ніж обрана як правильна. Чи можете ви позначити це правильним, щоб не плутати інших?
Ондрей Беркерт

1
Попередження: це не завжди працює . Я не знаю чому. Чи ти?
Бась

3
це має бути прийнята відповідь ... зробив те, що я хотів. Дякую!
кринкер

42
  • Використання -u з nohupпрацював для мене. Використовуючи -uбуде примусово stdout, stderrпотоки , щоб бути небуферізованних. Це не вплине на stdin. Все буде збережено у файлі " 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-task, для запуску речей у фоновому режимі та запланованого виконання.


Яка різниця у відповіді від @ vz0?
Декінг

1
@Deqing різниці немає.
Перезарядка


2

У Python 3.3 і вище є аргументований аргумент для друку, і це єдиний метод, який працював для мене.

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

0

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

Я зміг вирішити проблему:

  1. перенаправлення stdin, stdout і stderr
  2. переконавшись, що скрипт, який викликається через nohup, не працював у фоновому режимі нічого іншого

PS: мої сценарії були написані в ksh, що працює на RHEL

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.