Sair do zsh, mas deixar os jobs em execução abertos?


98

Acabei de mudar de bash para zsh.

No bash, as tarefas em segundo plano continuam em execução quando o shell é encerrado. Por exemplo aqui, dolphincontinua a correr após exit:

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

É isso que desejo como comportamento padrão.

Em contraste, o comportamento de zsh é alertar sobre a execução de jobs e exit, em seguida, fechá-los se você fizer isso exitnovamente. Por exemplo, aqui, dolphiné fechado quando o segundo exit-comando realmente sai do shell:

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

Como faço o comportamento padrão do zsh aqui como o do bash?

Respostas:


172

Inicie o programa com &!:

dolphin &!

O &!( ou equivalentemente,&| ) é um atalho específico do zsh para o segundo plano e rejeitar o processo, de forma que sair do shell o deixará em execução.


2
Para completar, você também pode listar como rejeitá-lo uma vez que já tenha sido iniciado?
trusktr

@trusktr Há uma pergunta diferente sobre rejeitar o processo de primeiro plano . Acho melhor mantê-lo separado para maior clareza. Para qualquer pessoa interessada em zsh especificamente, fiz uma pergunta no U&L SE sobre como criar um fluxo de trabalho mais rápido para rejeitar o processo de primeiro plano .
Anko

Eu gosto dessa solução e vou implementá-la para comandos individuais, mas ainda estou procurando uma maneira de mudar o comportamento padrão do Zsh.
Vince

1
@Vince Você quer dizer mudar o padrão para sempre rejeitar processos em segundo plano? Nesse caso, você pode fazer isso com setopt nohupno seu ~/.zshrc. Então, iniciar um comando em segundo plano com &também sempre o rejeitará. Embora, por padrão, o zsh ainda irá lembrá-lo de que há trabalhos em execução quando tentar sair. Você também pode desligar isso com setopt nocheckjobs.
Anko de

@Anko acho setopt nocheckjobsque faz o que eu quero. Agora encontrei as opções disponíveis em man zshoptions. Eu gostaria de desligar o aviso. Eu sei quando tenho processos em segundo plano e não preciso deles. Eu gostaria que fechasse os processos em segundo plano, a menos que eu os iniciasse com nohup. Atualmente, eu uso isso com uma função shell que executa o PyCharm em segundo plano com nohup. Quando eu digito, pycharm .ele é executado nohup charm $@ &. Ele não fecha quando eu fecho o terminal, mas ainda recebo esse aviso e preciso digitar exitduas vezes.
Vince

59

Da documentação zsh :

HUP

... No zsh, se você tiver um trabalho em segundo plano em execução quando o shell for encerrado, o shell assumirá que você deseja que ele seja encerrado; neste caso, é enviado um sinal específico chamado SIGHUP... Se você costuma iniciar trabalhos que devem continuar mesmo quando o shell foi encerrado, você pode definir a opção NO_HUPe os trabalhos em segundo plano serão deixados sozinhos.

Portanto, basta definir a NO_HUPopção:

% setopt NO_HUP

Se você não quer o aviso, sim.
Carl Norum,

30

Descobri que usar uma combinação de nohup, &e disownfunciona para mim, pois não quero que os jobs sejam executados permanentemente quando o shell for encerrado.

nohup <command> & disown

Embora &tenha funcionado para mim em bash, descobri que, ao usar apenas nohup, &ou disownem comandos em execução, como um script que chama um comando java run, o processo ainda pararia quando o shell fosse encerrado.

  • nohupfaz com que o comando ignore NOHUPe SIGHUPsinais do shell
  • & faz com que o processo seja executado em segundo plano em um subterminal
  • disownseguido por um argumento (o índice do número do trabalho em sua lista de trabalhos) evita que o shell envie um SIGHUPsinal para processos filho. Usar disownsem um argumento faz com que ele volte para o trabalho mais recente.

Encontrei as informações nohupe nesta página , e as informações nesta resposta SO .disown&


5

Eu normalmente uso screenpara manter a execução de trabalhos em segundo plano.

1) Crie uma sessão de tela:

screen -S myScreenName

2) Lance seus scripts, serviços, daemons ou qualquer outra coisa

3) Sair (desanexar) da sessão de tela com

screen -d

ou atalho ALT+A then d


Depois de algumas centenas de anos - se você quiser retomar sua sessão (reconectar):

screen -r myScreenName

Se você quiser saber se existe uma sessão de tela, seu nome e seu status (anexado ou desanexado):

screen -ls

Esta solução funciona em todos os interpretadores de terminal como bash, zsh etc. Veja também man screen


Uma observação para usuários de MacOS, o atalho de teclado para separar da tela era Control + A, depois D. Além disso, essa era minha única opção quando deixei um processo em execução e cedendo ao stdout, escrever screen -d ali não ajudaria.
Bishoy

Bom, mas nada a ver com o Q, que é especificamente sobre como manter as tarefas de bg funcionando ao sair do ZSH.
RichieHH
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.