Ответ 1
Запустите программу с помощью &!
:
dolphin &!
&!
(или, что то же самое, &|
) - это ярлык, специфичный для zsh для фона и отключение процесса, так что выход из оболочки оставит его.
Просто переключился с 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?
Запустите программу с помощью &!
:
dolphin &!
&!
(или, что то же самое, &|
) - это ярлык, специфичный для zsh для фона и отключение процесса, так что выход из оболочки оставит его.
Из документации zsh:
HUP
... В zsh, если у вас есть фоновая работа, выполняемая при выходе оболочки, оболочка предположит, что вы хотите, чтобы ее убили; в этом случае отправляется конкретный сигнал под названием
SIGHUP
... Если вы часто запускаете задания, которые должны продолжаться, даже когда оболочка вышла, тогда вы можете установить опциюNO_HUP
, а фоновые задания будут оставлены в покое.
Итак, просто установите параметр NO_HUP
:
% setopt NO_HUP
Я обнаружил, что использование комбинации nohup
, &
и disown
работает для меня, так как я не хочу, чтобы навсегда запускать задания, которые запускались после выхода оболочки.
nohup <command> & disown
Пока только &
работал у меня в bash
, я обнаружил, что при использовании только nohup
, &
или disown
при запуске команд, например, script, который вызывает команду java run, процесс все равно остановится при выходе оболочки.
nohup
заставляет команду игнорировать nohup
и SIGHUP
сигналы из оболочки&
заставляет процесс работать в фоновом режиме в субтерминалеdisown
, за которым следует аргумент (индекс номера задания в списке заданий), запрещает оболочке отправлять сигнал SIGHUP
дочерним процессам. Использование disown
без аргумента приводит к тому, что по умолчанию используется последнее задание.Я нашел информацию nohup
и disown
на на этой странице и &
информацию в этот ответ SO.
Обычно я использую screen
для сохранения фоновых заданий.
1) Создайте сеанс экрана:
screen -S myScreenName
2) Запустите свои скрипты, службы, демоны или что-то еще
3) Выйти (снять) экранную сессию с
screen -d
или ярлык ALT+A then d
Через несколько сотен лет - если вы хотите возобновить сеанс (повторное подключение):
screen -r myScreenName
Если вы хотите узнать, есть ли сеанс экрана, его имя и его статус (прикрепленный или отсоединенный):
screen -ls
Это решение работает на всех терминальных интерпретаторах, таких как bash, zsh и т.д. См. Также man screen