Кто-нибудь может объяснить, disown
необходимо ли это и почему, если вы хотите сохранить работу даже после отключения?
Я спрашиваю, потому что на всех сайтах, которые я посещал, рекомендуется использовать disown
, bg
но bg
само по себе оно у меня работает, и я не уверен, почему.
Это потому, что я не до конца понял, disown
для чего это нужно, или где-то есть какие-то настройки, которые влияют на поведение команды по умолчанию bg
?
Вот что я сделал:
- Подключился к моему компьютеру CentOS 6 через SSH
Создал простой процесс:
tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
Приостановил работу
- Возобновил его в фоновом режиме через
bg 1
- Отключено от SSH-сервера
Затем я проверил через FTP, .tar.gz
увеличивается ли размер файла, и это произошло.
решение1
Процессы, запущенные через bg
или , &
обычно завершаются в двух сценариях:
- Оболочка получает SIGHUP
- Они пытаются писать на терминал, которого больше не существует.
Пункт № 1 является основным виновником при закрытии вашего терминала. Однако произойдет это или нет, зависит откаквы закрываете свой терминал. Вы можете закрыть его:
- Что-то вроде нажатия «X» в вашем оконном менеджере
- Вы можете ввести
exit
,logout
, или CTRL+ D.
Пункт №1 — это тот, который приведет к отправке SIGHUP. Пункт №2 — нет.
Короче говоря, если вы переведете процесс в фоновый режим с помощью bg
, а затем выйдете из него с помощью exit
, logout
, или CTRL+ D, процесс не будет завершен.
решение2
Когда вы закрываете терминал, все процессы, которые используют этот терминал (см. TTY
столбец в ps -elf
выходных данных), получают SIGHUP
. Процесс решает, что делать с SIGHUP
. В классических Unix-системах (AIX, Solaris) процессы закрываются по этому сигналу. Вот почему вам нужно использовать disown
. Из man bash
:
Оболочка завершает работу по умолчанию при получении SIGHUP. Перед выходом интерактивная оболочка повторно отправляет SIGHUP всем работам, запущенным или остановленным. Остановленным работам отправляется SIGCONT, чтобы убедиться, что они получают SIGHUP. Чтобы запретить оболочке отправлять сигнал определенной работе, ее следует удалить из таблицы работ с помощью встроенной команды disown (см. ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ ниже) или пометить как не получающую SIGHUP с помощью disown -h.