Назад | Перейти на главную страницу

Проверить команду отказа

Я выпустил ^z; bg; disown последовательность, чтобы позволить мне закрыть сеанс ssh, в котором я запускаю очень важный длительный процесс. Этот процесс записывает вывод состояния в stderr, и он продолжает делать это даже после отсоединения (проверено с помощью lsof, stderr fd открыт для r / w).

Есть ли способ определить, что процесс действительно был отклонен (SIGHUP не будет получен, если оболочка вернет его)?

В Баше disown команда, выданная сама по себе, удалит фоновое заземление (через bg или &) из активной таблицы заданий и пометить их как не получающие SIGHUP при выходе из системы.

Вы также можете отказаться от одной или нескольких вакансий, например disown 1 3. В disown -h Флаг полезен, если вы хотите сохранить задания в таблице, но не SIGHUP при выходе из системы.

Вы можете просмотреть таблицу вакансий, выполнив jobs команда. После успешного фона он покажет [1]+ command &. После отказа от задания оно больше не должно отображаться в таблице заданий и больше не удаляться при выходе из системы. Вы все еще можете просмотреть процесс через ps ux, topи другие утилиты для просмотра процессов.

После того, как задание было отклонено, вы можете дождаться его естественного завершения или отправить сигнал через kill к PID, чтобы остановить его.

Поскольку Bash просто удаляет задание из списка запущенных заданий для завершения, а дескрипторы файлов для stdout вашего терминала и stderr все еще открыты, вы продолжите получать выходные данные из задания, пока ваше терминальное устройство не будет закрыто (когда вы выйдете из системы) .

Примеры:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Я обычно использую только disown если я запускаю потенциально длительную команду, например rsync или cp а затем решаю, что мне нужно выйти из системы, не прерывая ее. Если вы знаете, что собираетесь запустить команду и выйти из системы, вы можете записать вывод по конвейеру или teeпоместив его в файл, запустив его с nohup, или запустить его в screen (что позволяет вам снова получить право собственности на команду / завершить работу).

Примеры:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null