eu comecei
while true; do yad; sleep 60; done &
e fechei o terminal para testá-lo, agora tenho o mesmo problema.
Se você já fechou o terminal, iniciou o loop em
Vamos ter uma visão geral dos processos em execução, com ps fjx
as últimas linhas da minha máquina lidas
2226 11606 11606 19337 ? -1 S 1000 0:00 \_ /bin/bash
11606 22485 11606 19337 ? -1 S 1000 0:00 | \_ sleep 10
2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash
9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad
1 2215 2215 2215 ? -1 Ss 1000 0:00 /lib/systemd/systemd --user
2215 2216 2215 2215 ? -1 S 1000 0:00 \_ (sd-pam)
Você pode ver yad
como um subprocesso de /bin/bash
, se eu fechar, yad
ele muda sleep 60
na saída de ps
. Se a exibição em árvore for muito confusa, você também poderá procurar a saída da seguinte maneira 1 :
ps fjx | grep "[y]ad" # or respectively
ps fjx | grep "[s]leep 60"
As linhas de saída começam com dois números, o primeiro sendo o PPID, o ID do processo pai e o segundo o PID, o ID do próprio processo. É por isso que 9411
aparece nas duas linhas aqui:
2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash
9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad
Esse é o bash
subshell que queremos matar e acabamos de descobrir seu PID, então agora tudo o que resta é simples
kill 9411 # replace 9411 with the PID you found out!
e o subshell irritante se foi para sempre.
1 : A notação como, em grep "[y]ad"
vez de simplesmente, grep yad
impede que o grep
próprio processo apareça na lista de resultados.
Se você ainda tiver o terminal aberto
bash
fornece a variável $!
, que “se expande para a identificação do processo da tarefa mais recentemente colocada em segundo plano”, para que o seguinte acabe com o processo mais recente em segundo plano:
kill $!
Se não for o processo mais recente, é possível obter uma lista dos trabalhos em execução com a jobs
saída incorporada, exemplo:
[1]- Running while true; do
yad; sleep 60;
done &
[2]+ Stopped sleep 10
Existem dois trabalhos na lista de trabalhos, para matar um deles você pode acessá-lo com o número do trabalho ou os atalhos %
, %+
( “trabalho atual”) e %-
( “trabalho anterior”), por exemplo, para matar o loop funcionando no fundo você poderia fazer
kill %1 # or
kill %-
e matar o sleep 10
trabalho suspenso :
kill %2 # or
kill %+ # or
kill %
top
para interromper o processo pressionandok
, inserindo o PID e pressionando enter duas vezes.O
&
fará com que o terminal de criar um novo processo e obter o seu código seja executado no seu interior. Portanto, seu código se torna independente do processo do terminal. Mesmo se você fechar o terminal, o novo processo em que seu código está sendo executado não será interrompido. Portanto, remova&
ou façaps -aux
, localize seu processo e mate-okill (process id)
.fonte
Geralmente bg para o fundo fg para o primeiro plano. Se você usar & symbol, use fg, ele exibirá o programa atual em execução. Pressione Ctrl + C para matar.
fonte
bg
/fg
não funcionará quando o terminal for desconectadobash
. Não seria possível reconectar usandoreptyr
porquebash
possui processos filhos (sleep
).