Что означает символ амперсанда (&) с `nohup`?

11

Я видел множество примеров, когда &после конца командной строки стоит a, но я не могу найти объяснения, что он делает. Это даже не в nohup«S manстранице. Это снаряд?

Либо используя, &либо нет, я обнаружил, что любой запущенный процесс, nohupпохоже, обладает иммунитетом к любому сигналу зависания.

Чад Харрисон
источник
1
«Я считаю, что любой процесс, запущенный с помощью nohup, кажется, обладает иммунитетом к любому сигналу зависания». Вот для чего нужен nohup.
Сэмюэль Эдвин Уорд
Хорошо, позвольте мне уточнить: единственные примеры, которые я видел, используют &, так что я не был уверен, &был ли какой-то модификатор или аргумент, который заставлял nohupсебя вести себя по-другому.
Чад Харрисон
1
Это разумно подозревать. Фактически он не изменяет поведение nohup (nohup даже не видит его), но изменяет поведение оболочки.
Сэмюэль Эдвин Уорд
nohup & -> Нет Hangup и фон его. Из старых добрых времен модемов и серийных терминалов. Когда мой терминал и модем перейдут в автономный режим, продолжайте обрабатывать их в фоновом режиме, чтобы работа была выполнена, когда я в следующий раз выйду в сеть.
Fiasco Labs

Ответы:

19

Из справочной страницы bash :

Если команда завершается оператором управления &, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и статус возврата равен 0.

Так что да, это вещь оболочки и может использоваться с любой командой. По сути, он немедленно возвращает управление и позволяет завершить команду в фоновом режиме. Это почти всегда используется, nohupпотому что вы обычно хотите выйти из оболочки после запуска команды.

mgorven
источник
4
Я видел, как вы в последнее время публикуете кучу хороших ответов, и мой мозг всегда переводит ваше имя пользователя в McGuyver. Не уверен, почему я чувствую необходимость сказать тебе это.
MDMarra
1
@MDMarra Я приму это как комплимент ;-)
mgorven
1
@MDMarra По крайней мере, вы не думаете: «МакГрубер»
Уорд - Восстановить Монику
7

Использование амперсанда (&) запустит команду в дочернем процессе (дочернем по отношению к текущему сеансу bash). Однако при выходе из сеанса все дочерние процессы будут уничтожены.

использование nohup + ampersand (&) сделает то же самое, за исключением того, что когда сеанс завершится, родительский процесс дочернего процесса изменится на «1», то есть процесс «init», таким образом сохраняя дочерний процесс от уничтожения.

Мишель
источник
3

Да, это оболочка - она ​​запускает команду в фоновом режиме, поэтому вам не нужно ждать возврата текущей команды перед тем, как вводить другие команды.

грабить
источник