Від 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 залишати процес, а не вбивати його, коли оболонка закінчується.