Вийти з zsh, але залишити запущені завдання відкритими?


95

Просто перейшов з 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 за замовчуванням як баш?

Відповіді:


168

Запустіть програму з &!:

dolphin &!

&!( Або , що еквівалентно,&| ) являє собою ЗШ конкретного ярлика як фон і відхреститися процес, таким чином, що вихід з оболонки буде залишити її працювати.


2
Для повноти, чи можете ви також перерахувати, як відмовитися від нього, коли він уже запущений?
trusktr

@trusktr Інше питання про відмову від процесу переднього плану . Я думаю, що це краще для окремості для окремості. Для тих, хто цікавиться конкретно zsh, я задав питання на U&L SE про те, як створити швидший робочий процес для відмови від процесу переднього плану .
Анко

Мені подобається це рішення, і я буду застосовувати його для окремих команд, але я все ще шукаю спосіб змінити поведінку Zsh за замовчуванням.
Вінс

1
@Vince Ви маєте на увазі зміну за замовчуванням на завжди відмовлення від фонових процесів? Якщо так, ви можете зробити це за допомогою setopt nohupвашого ~/.zshrc. Потім запуск команди з фоном &також завжди відмовляється від неї. Хоча за замовчуванням zsh все одно нагадуватиме вам, що у вас є запущені завдання при спробі вийти. Ви також можете вимкнути це за допомогою setopt nocheckjobs.
Анко

@Anko Я думаю setopt nocheckjobs, що робить те, що я хочу. Тепер я знайшов доступні варіанти в man zshoptions. Я хотів би вимкнути попередження. Я знаю, коли у мене фонові процеси, і мені це не потрібно. Я хотів би, щоб він закривав фонові процеси, якщо я їх не запускав nohup. В даний час я використовую це з функцією оболонки, яка запускає PyCharm у фоновому режимі nohup. Коли я набираю, pycharm .він запускається nohup charm $@ &. Він не закривається, коли я закриваю термінал, але я все одно отримую це попередження і повинен ввести exitдвічі.
Вінс,

59

З документації zsh :

HUP

... У zsh, якщо у вас виконується фонове завдання, коли оболонка виходить, оболонка вважатиме, що ви хочете, щоб її вбили; у цьому випадку йому надсилається конкретний сигнал, який називається SIGHUP... Якщо ви часто запускаєте завдання, які повинні продовжуватися, навіть коли оболонка вийшла, тоді ви можете встановити параметр NO_HUP, і фонові завдання залишаться в спокої.

Тож просто встановіть NO_HUPопцію:

% setopt NO_HUP

Якщо ви не хочете попередження, так.
Carl Norum

30

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

nohup <command> & disown

Хоча просто &працював у мене bash, я виявив, що, використовуючи лише nohup,, &або disownпід час запуску команд, як сценарій, який викликає команду запуску Java, процес все одно зупиниться, коли буде виведено оболонку.

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

Я знайшов nohupі disownінформацію на цій сторінці , а також &інформація , що міститься в цьому SO відповідь .


5

Я зазвичай використовую screenдля підтримання роботи фонових завдань.

1) Створіть сеанс екрану:

screen -S myScreenName

2) Запустіть свої сценарії, сервіси, демони або щось інше

3) Вихід (від'єднання) екранного сеансу за допомогою

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.