Ho iniziato
while true; do yad; sleep 60; done &
e chiuso il terminale per testarlo, ora ho avuto lo stesso problema.
Se hai già chiuso il terminale hai iniziato il loop in
Diamo una panoramica dei processi in esecuzione con ps fjx
, le ultime righe sulla mia macchina leggere
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)
Puoi vedere yad
come un sottoprocesso di /bin/bash
, se lo chiudo yad
cambia sleep 60
in nell'output di ps
. Se la visualizzazione ad albero è troppo confusa, puoi anche cercare l'output come segue 1 :
ps fjx | grep "[y]ad" # or respectively
ps fjx | grep "[s]leep 60"
Le righe di output iniziano con due numeri, il primo è il PPID, l'ID processo del processo padre e il secondo è il PID, l'ID del processo stesso. È per questo che 9411
appare in entrambe le righe qui:
2226 9411 9411 8383 ? -1 S 1000 0:00 \_ /bin/bash
9411 17674 9411 8383 ? -1 Sl 1000 0:00 \_ yad
Questa è la bash
subshell che vogliamo uccidere e abbiamo appena scoperto il suo PID, quindi ora tutto ciò che rimane è semplice
kill 9411 # replace 9411 with the PID you found out!
e la fastidiosa subshell è andata per sempre.
1 : la notazione in quanto grep "[y]ad"
invece semplicemente grep yad
impedisce al grep
processo stesso di comparire nell'elenco dei risultati.
Se il terminale è ancora aperto
bash
fornisce la variabile $!
, che "si espande nell'ID del processo del lavoro più recentemente inserito in background", quindi ciò che segue uccide solo l'ultimo processo in background:
kill $!
Se non è il processo più recente, è possibile ottenere un elenco di processi in esecuzione con l' jobs
integrato, ad esempio output:
[1]- Running while true; do
yad; sleep 60;
done &
[2]+ Stopped sleep 10
Ci sono due lavori nella lista dei lavori, per uccidere uno di essi è possibile accedervi con il numero del lavoro o le scorciatoie %
, %+
("lavoro corrente") e %-
("lavoro precedente"), ad esempio per terminare il ciclo in esecuzione in background potrebbe fare
kill %1 # or
kill %-
e per terminare il sleep 10
lavoro sospeso :
kill %2 # or
kill %+ # or
kill %
top
per terminare il processo premendok
, quindi immettendo il PID, quindi premendo due volte Invio.