Вопрос: Проверить команду disown


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

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


10
2017-12-01 21:39


Источник


Интересно, нужно ли это unix.stackexchange.com - Rilindo
Просто любопытно, почему нет: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out & - Avery Payne


Ответы:


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

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

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

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

Поскольку Bash просто удаляет задание из списка выполняемых заданий для завершения, и файл обрабатывает стандартный вывод вашего терминала, а 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

12
2017-12-01 23:26



+1 Информативный и с примерами. Ницца! - Andy Smith
Очень информативный комментарий; вы говорите, что невозможно проверить отрывку процесса (кроме того, что он больше не существует в таблице рабочих мест)? - mikewaters
когда вы запускаете detach на фоне работы, он будет отстранен :) там нет на самом деле средней площадки там, где запуск его в фоновом режиме ничего не сделает. проверка jobs просто проверяет, что вы не пытались отсоединить остановленный процесс или что-то еще. - lunixbochs