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 exit
novamente 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
exit
mata os trabalhos interrompidos? - P: Existe uma maneira de sair do shell pela primeira vez? (sem entrar
exit
duas vezes)
Respostas:
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
jobs
comando builtin no bash, provavelmente outros shells. Exemplo:Você pode retomar um trabalho parado usando o
fg
comando 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 comandofg
. Se apenas um programa for parado, você poderá usarfg
sozinho:Neste ponto, você está de volta ao intérprete python e pode sair usando control-D.
Por outro lado, você pode
kill
executar o comando com jobspec ou PID. Por exemplo:Para usar o jobspec, preceda o número com a chave de porcentagem (%):
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
logout
comando 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:
Você pode retomar e matar esses trabalhos da mesma maneira que executou os trabalhos que parou com a
Ctrl-z
interrupção.fonte
Trabalho parado significa processo que recebeu sinal de parada (
SIGSTOP
/SIGTSTP
) do teclado (caractere de suspensão Ctrl-Z), comando (por exemplokill -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
.O processo parado somente retomará sua execução se for enviado o
SIGCONT
sinal. Isso pode ser alcançado porfg
(oufg ID
), que moverá o trabalho para o primeiro plano, tornando-o o trabalho atual,bg
para continuar em segundo plano ou enviandoSIGCONT
sinal (por exemplokill -CONT [PID]
).Na primeira vez em que você digita
exit
/logout
ou 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 acheckjobs
opção estiver ativada (shopt -s checkjobs
), ela também poderá listar os trabalhos com seus status.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)
.fonte