Disown não aceita opção -h

4

Estou executando um comando que agora percebo que gostaria de deixar em execução depois de encerrar minha sessão SSH. Eu não iniciei com um argumento & , mas coloquei em segundo plano ( CTRL - z , bg ). Agora eu estou tentando fazer isso continuar depois que eu me desconectar. Isso é o que disown -h é para, certo? Eu tentei disown -h e disown -h 1 ( jobs mostra meu trabalho como # 1) e recebo

disown: job not found: -h

Por que disown está tomando "-h" como um jobpec em vez de um argumento? Eu estou em zsh , se isso importa.

    
por Coderer 29.11.2012 / 19:05

2 respostas

5

bash , zsh e ksh93 são as camadas que possuem um comando disown . Dos três, bash é o único que suporta uma opção h . Sem -h , emulga zsh behavior (remove da tabela de jobs), enquanto com -h emula ksh93 behavior (não envia um SIGHUP ao sair, mas não o remove da tabela de jobs você ainda pode bg ou fg ou matá-lo).

Você pode emular esse comportamento com zsh, fazendo:

typeset -A nohup
trap 'disown %${(k)^nohup}' EXIT
trap 'for i (${(k)nohup}) (($+jobstate[i])) || unset "nohup[$i]"' CHLD

Assim, o array associativo nohup contém a lista de jobs que não devem ser enviados com SIGHUP quando sair. Então, em vez de disown -h %1 , você escreveria nohup[1]= .

Veja também setopt nohup para não enviar SIGHUP para qualquer trabalho na saída.

    
por 29.11.2012 / 21:04
3

disown por conta própria é suficiente para permitir que o programa continue sendo executado após a desconexão:

$ command_running_forever
^Z
zsh: suspended  command_running_forever
$ bg
[1]  + continued  command_running_forever
$ jobs
[1]  + running    command_running_forever
$ disown %1
$ logout

disown -h usa um argumento bash que faz com que a tarefa permaneça na tabela da tarefa e não recebe um SIGHUP quando o bash recebe um SIGHUP (de acordo com help disown do bash). Este argumento não está disponível com zsh.

    
por 29.11.2012 / 19:36