desenv-web-rp.com

Há trabalhos interrompidos (na saída do bash)

Eu recebo a mensagem There are stopped jobs. quando tento sair de um shell bash às vezes. Aqui está um cenário reproduzível em python 2.x:

  • ctrl+c é tratado pelo intérprete como uma exceção.
  • ctrl+z 'interrompe' o processo.
  • ctrl+d saídas python para reais.

Aqui está uma saída de terminal do mundo real:

[email protected]_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
[email protected]_server:~$ exit
logout
There are stopped jobs.

O Bash não saiu, preciso exit novamente para sair do bash Shell.

  • Q: O que é um 'trabalho interrompido' ou o que isso significa?
  • Q: Um processo parado pode ser retomado?
  • Q: O primeiro exit mata os trabalhos interrompidos?
  • Q: Existe uma maneira de sair do Shell pela primeira vez? (sem inserir exit duas vezes)
168
ThorSummoner

Um trabalho parado é um que foi temporariamente colocado em segundo plano e não está mais sendo executado, mas ainda está usando recursos (ou seja, memória do sistema). Como esse trabalho não está anexado ao terminal atual, ele não pode produzir saída e não está recebendo entrada do usuário.

Você pode ver os trabalhos em execução usando o comando jobs builtin no bash, provavelmente outros shells. Exemplo:

[email protected]:~$ jobs
[1] + Stopped                python
[email protected]:~$ 

Você pode retomar um trabalho parado usando o comando interno do bash fg (primeiro plano). Se você tiver vários comandos que foram parados, deverá especificar qual deles deve continuar passando o número de jobspec na linha de comandos com fg. Se apenas um programa for parado, você poderá usar fg sozinho:

[email protected]:~$ fg 1
python

Neste ponto, você está de volta ao interpretador python $ e pode sair usando o controle-D.

Por outro lado, você pode kill o comando com jobspec ou PID. Por exemplo:

[email protected]:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
[email protected]:~$ kill 17781
[1]+  Killed                  python
[email protected]:~$ 

Para usar o jobspec, preceda o número com a chave de porcentagem (%):

[email protected]:~$ kill %1
[1]+  Terminated              python

Se você emitir um comando de saída com trabalhos interrompidos, o aviso que você viu será fornecido. Os trabalhos permanecerão em execução por segurança. Isso é para garantir que você esteja ciente de que está tentando matar empregos que pode ter esquecido que parou. Na segunda vez em que você usa o comando exit, os trabalhos são encerrados e o Shell é encerrado. Isso pode causar problemas para alguns programas que não devem ser mortos dessa maneira.

No bash, parece que você pode usar o comando logout que mata os processos interrompidos e sai. Isso pode causar resultados indesejados.

Observe também que alguns programas podem não ser encerrados quando finalizados dessa maneira, e seu sistema pode acabar com muitos processos órfãos usando recursos, se você costuma fazer isso.

Observe que você pode criar um processo em segundo plano que será interrompido se eles exigirem entrada do usuário:

[email protected]:~$ python &
[1] 19028
[email protected]:~$ jobs
[1]+  Stopped                 python

Você pode retomar e eliminar esses trabalhos da mesma maneira que fez nos trabalhos que parou com o Ctrl-z interrompa.

221
OldTimer

P: O que é um 'trabalho interrompido' ou o que isso significa?

Trabalho parado significa processo que recebeu o sinal de parada (SIGSTOP/SIGTSTP) do teclado (caractere de suspensão Ctrl-Z), comando (por exemplo, kill -STOP [PID]) ou outro processo (por exemplo, kernel quando o sistema está com falta de recursos) e está em estado de pausa, por isso diz ao sistema para parar/suspender um processo para não executar nenhuma execução /em processamento.

Os trabalhos do Shell ativo podem ser listados por: jobs.

P: Um processo parado pode ser retomado?

O processo parado somente retomará sua execução se for enviado o sinal SIGCONT. Isso pode ser alcançado por fg (ou fg ID), Que moverá o trabalho para o primeiro plano, tornando-o o trabalho atual, bg para continuar em segundo plano ou por enviando sinal SIGCONT (por exemplo, kill -CONT [PID]).

P: A primeira saída mata os trabalhos interrompidos?

Primeira vez que você digita exit/logout ou pressiona Ctrl-D, o Shell imprime uma mensagem de aviso sobre os trabalhos ativos atuais associados ao seu terminal, portanto, não os matará sem a sua permissão, confirmando a ação pela segunda vez. Se a opção checkjobs estiver ativada (shopt -s checkjobs), Ela também poderá listar os trabalhos com seus status.

P: Existe uma maneira de sair do Shell pela primeira vez? (sem entrar na saída duas vezes)

Você pode pressionar Ctrl+D duas vezes ou segure-o por mais tempo, isso deixará o Shell silencioso rapidamente, matando os atuais trabalhos interrompidos/em execução no shel.

Alternativamente, repudie-os (disown) para deixá-los ou matá-los manualmente: kill $(jobs -p).

19
kenorb