Выйти из zsh, но оставить работающие вакансии открытыми?

96

Только что перешел с bash на zsh.

В bash фоновые задачи продолжают выполняться после выхода из оболочки. Например, здесь dolphinпродолжается выполнение после exit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

Это то, что я хочу по умолчанию.

Напротив, поведение zsh состоит в том, чтобы предупреждать о запущенных заданиях exit, а затем закрывать их, если вы exitснова. Например, здесь dolphinзакрывается, когда вторая exit-команда действительно выходит из оболочки:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

Как мне сделать здесь поведение zsh по умолчанию, как у bash?

Owen_R
источник

Ответы:

169

Запустите программу с &!:

dolphin &!

&!( Или , что эквивалентно,&| ) представляет собой ЗШ конкретного ярлыка как фон и откреститься процесс, таким образом, что выход из оболочки будет оставить ее работать.

Анко
источник
2
Для полноты картины не могли бы вы также указать, как отречься от него, если он уже запущен?
trusktr
Мне нравится это решение, и я буду реализовывать его для отдельных команд, но я все еще ищу способ изменить поведение Zsh по умолчанию.
Винс
1
@Vince Вы имеете в виду изменение по умолчанию, чтобы всегда отказываться от фоновых процессов? Если да, вы можете сделать это setopt nohupв своем ~/.zshrc. Тогда запуск команды, основанной на фоновом режиме &, также всегда будет отвергать ее. Хотя по умолчанию zsh все равно будет напоминать вам, что у вас есть запущенные задания, когда вы пытаетесь выйти. Вы также можете отключить это с помощью setopt nocheckjobs.
Анко
@ Анко, я думаю, setopt nocheckjobsделает то, что хочу. Теперь я нашел доступные варианты в man zshoptions. Я хочу отключить предупреждение. Я знаю, когда у меня есть фоновые процессы, и они мне не нужны. Я бы хотел закрыть фоновые процессы, если я не запустил их с nohup. В настоящее время я использую это с функцией оболочки, которая запускает PyCharm в фоновом режиме с помощью nohup. Когда я печатаю, pycharm .он запускается nohup charm $@ &. Он не закрывается, когда я закрываю терминал, но я все равно получаю это предупреждение и мне приходится печатать exitдважды.
Винс
59

Из документации zsh :

HUP

... В zsh, если у вас есть фоновое задание, выполняющееся при выходе из оболочки, оболочка предполагает, что вы хотите, чтобы это было убито; в этом случае ему посылается особый сигнал, который называется SIGHUP... Если вы часто запускаете задания, которые должны продолжаться даже после выхода из оболочки, вы можете установить эту опцию NO_HUP, и фоновые задания останутся в покое.

Так что просто установите NO_HUPопцию:

% setopt NO_HUP
Карл Норум
источник
Если вы не хотите предупреждения, да.
Карл Норум
30

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

nohup <command> & disown

В то время как раз &работал для меня bash, я нашел только при использовании nohup, &или disownна выполнение команд, как сценарий , который вызывает команду Java запустить процесс все равно остановится , когда оболочка закрывается.

  • nohupзаставляет команду игнорировать NOHUPи SIGHUPсигналы от оболочки
  • & заставляет процесс работать в фоновом режиме на субтерминале
  • disownза которым следует аргумент (индекс номера задания в списке заданий) предотвращает отправку командным интерпретатором SIGHUPсигнала дочерним процессам. Использование disownбез аргумента приводит к использованию по умолчанию самого последнего задания.

Я нашел nohupи disownинформацию на этой странице , а также &информация , содержащаяся в этом SO ответ .

ryanjdillon
источник
5

Обычно я использую screenдля поддержания фоновых заданий.

1) Создайте сеанс экрана:

screen -S myScreenName

2) Запустите свои скрипты, службы, демоны или что-то еще

3) Выйти (отсоединить) screen-сессию с

screen -d

или ярлык ALT+A then d


Через несколько сотен лет - если вы хотите возобновить сеанс (повторно подключиться):

screen -r myScreenName

Если вы хотите узнать, есть ли экранный сеанс, его имя и статус (прикреплен или отключен):

screen -ls

Это решение работает со всеми интерпретаторами терминалов, такими как bash, zsh и т. Д. См. Также man screen

Айдын К.
источник
Примечание для пользователей MacOS: сочетание клавиш для отсоединения от экрана было Control + A, затем D. Также это был мой единственный вариант, когда я оставил процесс запущенным и уступил stdout, написание screen -d там не помогло.
Бишой
Красиво, но не имеет ничего общего с Q, который конкретно посвящен тому, как поддерживать выполнение задач bg при выходе из ZSH.
RichieHH