Выход из 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

Другие вопросы по тегам