Необходимо ли отменять владение процессом, чтобы он продолжил работу после отключения?

Необходимо ли отменять владение процессом, чтобы он продолжил работу после отключения?

Кто-нибудь может объяснить, 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или , &обычно завершаются в двух сценариях:

  1. Оболочка получает SIGHUP
  2. Они пытаются писать на терминал, которого больше не существует.

Пункт № 1 является основным виновником при закрытии вашего терминала. Однако произойдет это или нет, зависит откаквы закрываете свой терминал. Вы можете закрыть его:

  1. Что-то вроде нажатия «X» в вашем оконном менеджере
  2. Вы можете ввести 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.

Связанный контент