Перенаправити nohup на stdout


14

Чи можна дозволити процес, розпочатий з nohup, записати в stdout замість файлу? а може, у файлі та на екрані?

nohup python start.py &

пише в nohup.out, але я хотів би, щоб він виводив на екран, nohup мається на увазі лише як хеджування, коли з'єднання розривається.


Але що відбувається, коли ваша програма виводиться після розриву зв'язку?
живіт

Відповіді:


4
  1. nohup python start.py & tail -f nohup.out За tail -fбажанням можна вбити і перезапустити.

  2. screen python start.py та відключити / знову підключити за бажанням.


10

Від man nohup:

Якщо стандартним входом є термінал, перенаправляйте його з / dev / null. Якщо стандартний вихід є терміналом, додайте вихід, nohup.out якщо можливо, $HOME/nohup.outінакше. Якщо стандартна помилка є терміналом, перенаправляйте її на стандартний вихід. Щоб зберегти вихід у FILE, використовуйте nohup COMMAND > FILE.

(повністю переглянуто на основі коментарів)
Під час виходу з оболонки або закриття терміналу дочірні процеси будуть надіслані SIGHUP (повісити, назва походить з часу, коли термінали набиратимуться на комп'ютер UNIX), щоб повідомити їм, що термінал не довше з'єднані. Крім того, коли процес оболонки закінчиться, потоки stdin, stdout та stderr процесу дочірнього процесу будуть закриті. Зазвичай це призводить до загибелі процесу дитини. Зазвичай це хороша річ, оскільки це дозволяє уникати процесів, що працюють без користувача.

Мета nohupпрограми - підтримувати процес навіть після закінчення оболонки та відключення терміналу. Таким чином, спрямування його виходу на термінал повністю перемагає мету. Моя оригінальна відповідь ( nohup COMMAND | cat) не була корисною, тому що: коли закритий термінал, вихід кішки закривається, і тому кішка гине, яка розриває трубу і відправляє SIGPIPE до процесу nohup, приводячи її до загибелі. Я відповів на питання, не думаючи про мету.

Щоб досягти своєї мети, запустіть nohup COMMAND > FILEдля вибору імені файлу, на який слід направити вихід. Потім використовуйте tail -f FILEдля перегляду виходу на терміналі.

Аналогічно можна використовувати таку конструкцію оболонки: COMMAND >FILE 2>&1 </dev/null &запустити команду, потоки stdio якої не підключені до терміналу і можуть продовжувати працювати після закриття терміналу. Крім того, в zsh запустіть вбудований оболонку, disownщоб сказати zsh залишати процес, а не вбивати його, коли оболонка закінчується.


1
Одне приємне доповнення: Якщо команда nohup вже була запущена з іменем файлу, ви можете використовувати, tail -f filenameщоб побачити, що записано у файл.
Hennes

Не працює, як тільки з’єднання припиняється, файл більше не записується
Davoud Taghawi-Nejad

Ви маєте рацію: я відповів на запитання (надішліть висновок до терміналу), але перемогли мету. Відповідно я переписав свою відповідь.
dsh

-1
vladimir@lin-mint-cin:~$ tty<br>
/dev/pts/8<br>
vladimir@lin-mint-cin:~$ ln -sf /dev/pts/8 nohup.out<br>
vladimir@lin-mint-cin:~$ nohup ls<br>
nohup: ввод игнорируется, вывод добавляется в 'nohup.out'<br>
2019-05-31-090159.jpg    giphy.gif        nim_porojects   sketchbook
Aptana_Studio_Workspace  IdeaProjects         nohup.out       target
Desktop          jack_capture_01.wav  Pictures        Templates
Documents        lib              Postman         tmp
Downloads        mad              Projects        trace.edn
eclipse          Mail             prolog_ws       uinfild_hill-iskusstvo_shemotehniki_tom_1_izd4-e-1489315100.pdf
eclipse-dsl-workspace    Music            proxy-secret    Videos
eclipse-workspace    mygolo           Public          workspace-dltk
erlang_ex        my_golo_ws       rust-workspace  проекты
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.