Как отвязать процесс от терминала в Ubuntu

В лекции посвященной процессам и задачам в bash преподаватель рассказал нам о команде nohup, которая может защитить процесс от сигнала SIGHUP, который посылает своим дочерним процессам, процесс-родитель, когда завершает свою работу. Когда из текстовой консоли Linux или графического терминала (gnome-terminal) запускается команда, которая работает в фоне, то при закрытии терминала или выходе из консоли, команда также прекратит свою работу.

Если ближе к практике, то речь идет о следующем. Проведем эксперимент. Запускаем графический терминал (gnome-terminal) и пишем в нем команды:

1
2
3
4
$ gnome-calculator &
[1] 3075
$ gedit &
[2] 3076

В результате будут запущены два графических приложения: калькулятор и редактор. Теперь закроем терминал нажав на кнопку закрытия (”крестик”). Как видите вместе с терминалом завершили работу и приложения запущенные из него. Снова открываем терминал и пишем такие команды:

1
2
3
$ nohup gnome-calculator &
[1] 3100
igor@adm-ubuntu:~$ nohup: ввод игнорируется, вывод добавляется в `nohup.out'

Здесь нажимаем Enter, чтобы вернуть приглашение терминала и пишем далее:

1
2
3
$ nohup gedit &
[2] 3101
igor@adm-ubuntu:~$ nohup: ввод игнорируется, вывод добавляется в `nohup.out'

И также нажимаем Enter. Теперь снова закрываем терминал, нажав на “крестик”. Теперь приложения остались работать и не закрылись. Команду nohup можно использовать, но есть приложения с которыми она не срабатывает. Например, браузер Opera. Набрав, nohup opera & и закрыв терминал, Opera также завершит свою работу.

В оболочке bash есть встроенная команда, которая больше подходит для требуемой задачи. Это команда disown. Приложения запущенные в терминале в фоне (приложения запущенные со знаком &), являются задачами или заданиями (jobspec в мане), которые формируют таблицу заданий. При выходе из терминала bash просматривает эту таблицу и посылает всем заданиям сигнал SIGHUP. Команда disown занимается тем, удаляет задания из таблицы заданий. Посмотреть информацию о команде disown можно в справке man bash. На всякий случай процитирую здесь фрагмент из справки:

disown [-ar] [-h] [jobspec ...]

Without options, each jobspec is removed from the table of active jobs. If jobspec is not present, and neither -a nor -r is supplied, the shell’s notion of the current job is used. If the -h option is given, each jobspec is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If no jobspec is present, and neither the -a nor the -r option is supplied, the current job is used. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a jobspec argument restricts operation to running jobs. The return value is 0 unless a jobspec does not specify a valid job.

Дальше несколько примеров. Открываем терминал и пишем команды:

1
2
3
4
5
6
$ gedit &
[1] 3371
$ jobs
[1]+  Running  gedit &
$ disown %1
$ jobs

Команда jobs в третьей строке показывает, что в таблице заданий находится задание под номером 1. Команда disown %1 убирает это задание из таблицы. Следующей командой jobs проверяем, что действительно в таблице теперь нет заданий. После этого закрываем терминал и видим, что редактор gedit работает.

С ключом -h задания не будут удалятся из таблицы, но сигнал SIGHUP все равно обрабатывать не будут. Закроем gedit и выполним команды еще раз:

1
2
3
4
5
6
7
$ gedit &
[1] 3953
$ jobs
[1]+  Running                 gedit &
$ disown -h %1
$ jobs
[1]+  Running                 gedit &

Как видите задание осталось, в таблице, но если закрыть терминал, то все равно gedit будет работать. Запущенная без параметров команда disown удалит из таблицы заданий все задания. Дальше можете поэкспериментировать сами.

Также хочу добавить, что если из графического терминала в Ubuntu выходить по команде exit, то запущенные из терминала приложения останутся работать и без команд nohup или disown.

Чуть не забыл о браузере Opera :) С командой disown все работает так как нужно. То есть для того чтобы опера не закрывалась после закрытия графического терминала нужно после запуска команды выполнить команду disown:

1
2
$ opera &
$ disown

Теперь если нажать на “крестик”, то после закрытия терминала, браузер будет работать.

Статьи и новости схожей тематики:

Оставьте свой отзыв