Якщо я запускаю фоновий процес, а потім виходжу з системи, чи продовжуватиме він працювати?


29

Запитуючи це після тривалої дискусії з колегою, я дуже хотів би пояснення тут.

Я запускаю фоновий процес, додаючи " &" до командного рядка або зупиняючи його CTRL-Zі відновлюючи його у фоновому режимі з " bg". Потім я виходжу.

Що сталося?

Ми були цілком впевнені, що це повинно було бути вбито СІДУ, але цього не сталося; після повторного входу в систему, процес був щасливо запущений і pstreeпоказав, що його "прийняли" init.

Це очікувана поведінка?

Але тоді, якщо це так, яка nohupмета команди? Це просто виглядає так, що процес ні в якому разі не буде вбито, з ним чи без нього ...


Редагуйте 1

Ще кілька деталей:

  • Команда була запущена з сеансу SSH, а не з фізичної консолі.
  • Команда була запущена без nohup та / або &; Потім його було призупинено CTRL-Zта відновлено у фоновому режимі з bg.
  • Сеанс ssh не припинявся. Був власне вихід ( exitкоманда " ").
  • Процес був scpоперацією копіювання файлів.
  • Після входу знову pstreeпоказав процес, який працює та є дитиною дитини init.

Редагуйте 2

Більш чітко викласти питання: чи покласти процес у фоновий режим (використовуючи &чи bg) змусить його ігнорувати SIGHUP, як і nohupкоманда?


Правка 3

Я спробував вручну посилаючи SIGHUPдо scp: він вийшов, так що це безумовно не ігнорувати сигнал.

Потім я знову спробував його запустити, відклавши його на задній план і вийти з системи: його "прийняли" initі продовжували працювати, і я знайшов його там, коли входив назад.

Зараз я зовсім спантеличений. Схоже, що жодного SIGHUPразу не було надіслано.


Я там не бачив жодної згадки про введення / виведення консолі, яка також відключить речі. Ви відволікали речі, тобто 1>/dev/null 2>&1на баш, тощо?
Avery Payne

Ні, я цього не зробив. SCP, звичайно, не вимагав стандартного введення ... а стандартний вихід не здавався проблемою.
Массімо

Незалежно від того, виконана ваша оболонка, як оболонка для входу, змінює продуктивність, що може бути тут.
Warner

Зробив деякі інші тести; Я підсумував це тут: serverfault.com/questions/117152 .
Массімо

Відповіді:


20

Відповідь знайдена

Для BASH це залежить від параметра huponexitоболонки, який можна переглянути та / або встановити за допомогою вбудованої shoptкоманди.

Схоже, ці параметри вимкнено за замовчуванням, принаймні, на системах, що базуються на RedHat.

Більше інформації на чоловічій сторінці BASH :

Оболонка виходить за замовчуванням після отримання SIGHUP. Перед виходом інтерактивна оболонка надсилає SIGHUP на всі завдання, запущені або зупинені. Зупинені завдання надсилаються SIGCONT, щоб переконатися, що вони отримують SIGHUP. Щоб оболонка не надсилала сигнал до певного завдання, його слід видалити з таблиці завдань із вбудованим відхиленням (див. SHELL BUILTIN COMMANDS нижче) або позначити, щоб не отримувати SIGHUP за допомогою відключення -h.

Якщо параметр оболонки huponexit був встановлений з shopt, bash надсилає SIGHUP на всі завдання, коли виходить інтерактивна оболонка входу.


2
Це дурний дефолт, але мої кишки говорять мені, що це провина RH, а не башти. Btw, з zsh ви можете використовувати &! як ярлик для відмови, і процеси, роздвоєні & &, отримують зітхання.
Юрген Стробель

7

Я погоджуюся з Warner і просто хочу додати, що ви можете утримати оболонку від надсилання SIGHUP за допомогою вбудованої команди "disown". Сторінка bash man містить хороший опис.


4

Ви можете використовувати команду nohup для запуску команди та перенаправлення виводу у вихідний файл nohup. На сторінці "nohup man":

nohup - run a command immune to hangups, with output to a non-tty

Інший варіант - використовувати команду екрана . Перевага використання екрана полягає в тому, що ви зможете пізніше підключитися до процесу.


Чому голоси? Використання nohup та екрана - цілком прийнятні способи уникнути вбивства процесу під час виходу. Є й інші, але обоє працюють. Яка угода?
Джим

2
Я думаю, що це чудовий момент, але Q полягає в тому, чому його процеси не вбиваються НЕ "як уберегти їх від загибелі".
CarpeNoctem

2

Коли ви відкидаєте процес на другий план, це все ще буде дочірнім процесом із оболонки, що виконує його.

Усі дочірні процеси, що працюють під оболонкою, надсилаються SIGHUP після виходу. Продуктивність дещо відрізняється в залежності від точної ситуації, яка докладно описана в мапі на сторінці Баша. Інші оболонки, ймовірно, мають аналогічні описи.

Apache та інші демони, як правило, перезавантажують конфігурацію на SIGHUP. Утиліти простору користувачів часто гинуть. Продуктивність програми, пов'язана з сигналами, може бути унікальною для програми.


Тож процес просто мав би отримати ЗАРАЗ у цьому випадку, правда? Можливо, це просто проігнорував, я перевірю.
Массімо

Так, саме. Це я вважаю ситуацією. Якщо ви дійсно сумніваєтесь у документально підтвердженому виконанні, ви можете зламати невеликий сценарій, щоб захопити сигнал і записати його.
Warner

0

Яким був процес? Виконання, описане в попередній публікації 1, було точним.

Деякі функції та процеси сценарію можуть захоплювати сигнали. тоді як петлі можуть тікати, як божевільні.

Побачити:

Сеанс SSH падає - Чи команда продовжує виконувати?

Редагуйте 1 о 16:22

З баш-сторінки:

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

Первісне дослідження 1 показує, що OpenSSH, ймовірно, ігнорує SIGHUP, можливо більше сигналів.


Ця посада насправді надіювала мене на запитання. Детальніше див. Редагувати вище.
Массімо

2
Відповіді в іншому потоці звучать так, що вам потрібно прочитати команду SCP, яку ви використовуєте, і подивитися, як вона реагує на SIGHUP
mfinni

І "nohup" - це команди, за якими ви знаєте, що загинуть за допомогою SIGHUP, і ви не хочете, щоб вони це робили.
mfinni

Сторінка людини просто не говорить про це; Я спробую вбити його -ХУП завтра ...
Массімо,

-1

Якщо ви не запустили команду через такий інструмент, як screen, коли сеанс закінчиться, виконайте всі завдання / завдання, пов’язані з цим сеансом.


Саме так я і думав, окрім ... вони просто не зробили.
Массімо

вони мають кожен раз, коли я робив те, що ви описали ... можливо, це залежить від оболонки, яку ви використовуєте?
warren

-1 Їх немає; відповідь не така проста. Я тільки перевірив простий скрипт оболонки, який я почав у фоновому режимі; він циклічно та відправляє вихід у тимчасовий файл. Він продовжував працювати після того, як я вийшов з терміналу (як видно tail -fз темп-файлу. Це на машині CentOS 7.1 за допомогою bash.
Mike S

@MikeS - продемонструйте. Я ніколи не був свідком поведінки, яку ви описуєте
warren

@warren - Дивіться моя відповідь на serverfault.com/questions/117152 / ... . Зауважте, що деякі люди заявляють, що поведінка відрізняється від описаної вами; Дійсно, Массімо виклав саме тому, що його процес тривав.
Майк S
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.