Existem trabalhos interrompidos (na saída do bash)

142

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

  • ctrl + c é tratado pelo interpretador como uma exceção.
  • ctrl + z 'interrompe' o processo.
  • ctrl + d sai do python para reais.

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

example_user@example_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
example_user@example_server:~$ exit
logout
There are stopped jobs.

O Bash não saiu, devo exit novamente para sair do bash shell.

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

2 respostas

189

Um trabalho interrompido é aquele que foi colocado temporariamente em segundo plano e não está mais em execução, mas ainda está usando recursos (por exemplo, memória do sistema). Como esse trabalho não está conectado 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 também. Exemplo:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Você pode retomar um trabalho interrompido usando o comando interno bash fg (foreground). Se você tiver vários comandos que foram interrompidos, deverá especificar qual deles deverá ser retomado, passando o número de jobspec na linha de comando com fg . Se apenas um programa for interrompido, você poderá usar fg sozinho:

user@mysystem:~$ 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:

user@mysystem:~$ 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
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

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

user@mysystem:~$ 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 serão deixados em funcionamento por segurança. Isso é para ter certeza de que você está ciente de que está tentando matar os trabalhos que você pode ter esquecido que parou. Na segunda vez que você usa o comando exit, os trabalhos são finalizados 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 matará os processos parados e sairá. Isso pode causar resultados indesejados.

Observe também que alguns programas podem não sair quando terminados dessa maneira, e seu sistema pode acabar com muitos processos órfãos usando recursos se você tiver o hábito de fazer isso.

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

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Você pode continuar e eliminar esses trabalhos da mesma forma que os trabalhos que parou com a Ctrl-z

.

    
por 26.02.2014 / 02:50
16

Q: What is a 'stopped job', or what does this mean?

Trabalho interrompido significa processo que recebeu sinal de parada ( SIGSTOP / SIGTSTP ) do teclado (suspender caractere 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, então ele diz ao sistema para parar / suspender um processo para que ele não execute nenhuma execução / processamento.

Os trabalhos de shell ativos podem ser listados por: jobs .

Q: Can a stopped process be resumed?

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

Q: Does the first exit kill the stopped jobs?

Na primeira vez que você digitar exit / logout ou pressionar Ctrl-D , o shell imprimirá uma mensagem de aviso sobre os trabalhos ativos atuais associados ao seu terminal, portanto não mate-os sem a sua permissão confirmando a ação na segunda vez. Se a opção checkjobs estiver ativada ( shopt -s checkjobs ), ela também poderá listar as tarefas com seus status.

Q: Is there a way to exit the shell the first time? (without entering exit twice)

Você pode pressionar Ctrl + D duas vezes ou segurá-lo por mais tempo, isso irá sair do shell silenciosamente matando rapidamente os trabalhos atuais de interrupção / execução.

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

    
por 20.02.2016 / 14:37