Por que não desarmar operar no último trabalho se eu fundo isso?

4

Digamos que eu tenha passado por um processo, por exemplo VIM com ctrl-z. Então eu inicio um xterm usando o seguinte comando xterm &> /dev/null & . Se eu apenas digitar disown, então perderei meu processo de vim. Eu tenho que digitar o PID do processo xterm para rejeitá-lo.

Existe alguma maneira de contornar isso ou há uma razão para isso acontecer?

    
por Joe 22.10.2015 / 16:18

1 resposta

4

Como corrigir (versão curta)

Você tem algumas maneiras de fazer isso:

  • Com %- , você pedirá para negar o último trabalho em segundo plano .

    xterm &> /dev/null & disown %-
    
  • Com $! , você pedirá para negar o último trabalho executado (através de seu PID).

    xterm &> /dev/null & disown $!
    

Então será necessário escrever mais alguns caracteres, mas pelo menos você pode escolher quais :-)

As razões

O motivo está todo aqui: quando você executa um trabalho enviando-o para o plano de fundo com & , essencialmente ele não altera o trabalho atual, mas apenas o anterior. O trabalho atual permanece o que foi antes.

Algumas palavras mais e um exemplo

Você pode verificar o que foi dito acima com o comando jobs , comparando sua saída antes e depois para lançar um trabalho em segundo plano.

  • Antes : suponhamos que você tenha alguns processos em segundo plano sendo executados em um terminal (por exemplo, lançado com dolphin & e kate & ).
    Agora você inicia vim e o suspende com Ctrl-Z .
    A saída de jobs será:

    [1]   Running                 dolphin . &
    [2]-  Running                 kate  &
    [3]+  Stopped                 vim
    

    vim é o trabalho atual, marcado com um + e kate é o anterior, sinalizado com - .

    De fato, no manual de referência bash, capítulo 7.1 [ 1 ] é explicado que
    "Na saída pertencente a tarefas (por exemplo, a saída do comando jobs), a tarefa atual é sempre marcada com um '+' e a tarefa anterior com um '-'. "

  • Após : Finalmente, você escreve seu comando xterm &> /dev/null & (sem disown ).

    Perguntando ao jobs , desta vez ele responderá:

    [1]   Running                 dolphin .
    [2]   Running                 kate 
    [3]+  Stopped                 vim
    [4]-  Running                 xterm &> /dev/null &
    

    Observe que vim ainda está sinalizado com + e xterm com - .
    O último trabalho em segundo plano marcado com - é xterm e não mais kate & .

  • Em outras palavras, o sistema age como se

    • Primeiro, executa xterm : o novo comando ( xterm ) se torna o atual e vim o anterior.
    • Em seguida, xterm é enviado em segundo plano e o controle volta para o anterior na lista ( vim com seu status), que se torna novamente o atual e é marcado novamente com + xterm é o novo trabalho anterior e está marcado com um - .
    • No final, você encontra atualizado apenas o trabalho anterior (-) e não o atual (+).

Como você pode chamar disown seguido por um número de trabalho ou por um PID, você tem as duas variantes

  • %- : o trabalho anterior pode ser referenciado usando %- , talvez mais fácil de lembrar se você acha que também em trabalhos está marcado com -

  • $! : o PID do último trabalho executado em segundo plano está no parâmetro especial $! [2 ] .

O comando disown aceitará ambos.

Referências

por 27.10.2015 / 13:41