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