Respostas:
eu comecei
while true; do yad; sleep 60; done &
e fechei o terminal para testá-lo, agora tenho o mesmo problema.
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.
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 %
Eu preciso observar que quando você fecha o terminal onde inseriu esse comando, o subcomando deveria ter morrido junto com ele. Tentando reproduzir isso mostrou esse comportamento.
Agora, supondo que você realmente esteja em uma situação em que isso não aconteceu, uma maneira de matar o programa que você deixou em execução em segundo plano, causado pelo &
final do comando, é o seguinte:
echo $$
para anotar seu PID (ID do processo) atual, para não matar sua própria sessão.ps -ef | grep $SHELL
comando para descobrir quais programas estão executando um shell.echo $$
resultado acima; este é o PID que você deseja matar.kill -SIGTERM <pid>
comando, onde <pid>
está o valor numérico que você identificou na etapa # 3Você também pode reiniciar sua sessão ou seu computador, mas as opções acima permitirão evitar isso.
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ça ps -aux
, localize seu processo e mate-o kill (process id)
.
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.
bg
/ fg
não funcionará quando o terminal for desconectado bash
. Não seria possível reconectar usando reptyr
porque bash
possui processos filhos ( sleep
).
top
para interromper o processo pressionandok
, inserindo o PID e pressionando enter duas vezes.