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

158

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

  • ctrl+ cé tratado pelo intérprete como uma exceção.
  • ctrl+ z'interrompe' o processo.
  • ctrl+ dsai do python por 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.

Bash não saiu, devo exitnovamente sair do shell bash.

  • P: O que é um 'trabalho interrompido' ou o que isso significa?
  • P: Um processo parado pode ser retomado?
  • P: O primeiro exitmata os trabalhos interrompidos?
  • P: Existe uma maneira de sair do shell pela primeira vez? (sem entrar exitduas vezes)
ThorSummoner
fonte
ctrl + shift + \ também fará a saída do python.
ThorSummoner

Respostas:

206

Um trabalho parado é um que foi temporariamente colocado em segundo plano e não está mais sendo executado, mas ainda está usando recursos (por exemplo, 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 jobscomando builtin no bash, provavelmente outros shells. Exemplo:

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

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

user@mysystem:~$ fg 1
python

Neste ponto, você está de volta ao intérprete python e pode sair usando control-D.

Por outro lado, você pode killexecutar 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 de porcentagem (%):

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 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 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 logoutcomando que matará os processos interrompidos e sairá. 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:

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

Você pode retomar e matar esses trabalhos da mesma maneira que executou os trabalhos que parou com a Ctrl-zinterrupção.

OldTimer
fonte
4
Gostaria de discutir com sua segunda frase. Ele deve dizer: “Porque o trabalho é interrompido , ele não pode tomar qualquer acção -. Arquivo de I / O, rede de E / S, terminal I / O, ou qualquer outro processamento”
Scott
2
Isto me ajuda muito.
shellbye
Excelente post ótima ajuda para qualquer um!
George Udosen
18

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

Trabalho parado significa processo que recebeu 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 / processamento.

Empregos shell ativos podem ser listados por: jobs.

P: Um processo parado pode ser retomado?

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

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

Na primeira vez em que você digita exit/ logoutou pressiona Ctrl-D, o shell imprime uma mensagem de aviso sobre os trabalhos ativos atuais que estão associados ao seu terminal, portanto, não os matará sem a sua permissão, confirmando a ação pela segunda vez. Se a checkjobsopção 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+Dduas vezes ou mantenha-o pressionado por mais tempo; isso deixará o shell silencioso rapidamente, matando os atuais trabalhos interrompidos / em execução shel.

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

kenorb
fonte