Come trovare processi ancora in esecuzione in un terminale?


12

Quando provo a chiudere una scheda in Gnome Terminal, dice:

Chiudi questo terminale? C'è ancora un processo in esecuzione in questo terminale. Chiudere il terminale lo ucciderà.

Come posso sapere cosa è ancora in esecuzione? Si noti che non c'è nulla nell'output di jobs. Grazie.


1
Se al prompt della shell viene visualizzato questo messaggio, probabilmente si tratta di una shell nidificata (non quella avviata direttamente dall'emulatore di terminale). Forse hai iniziato una screen, tmux, script, ssh, mce trasformato i pannelli off, o solo un'altra shell per esempio battitura bash, o qualcosa in questo senso. Premi Ctrl + D o digita exitper uscire dalla shell, vedrai dove finirai.
egmont,

Grazie. dopo exit, la scheda del terminale di gnome non si chiude.
Tim

1
Un secondo exitprobabilmente lo chiuderà allora. @egmont puoi spostare questo in una risposta per favore.
Videonauth,

Risposte:


12
ps T

Seleziona tutti i processi associati al terminale.


Bene, anche se può essere un po 'ingannevole. I processi generati tramite nohupcomando sono disconnessi dal terminale, quindi non bloccarne la chiusura. Ma sono ancora elencati con questo comando.
Sergiy Kolodyazhnyy il

O semplicemente ps per quella materia
user10089632

1

Puoi dare un picco ai processi che elencano il PID della shell come genitore. Come potresti sapere o meno, possiamo specificare il psformato

SHELLPID=$$ ; ps -e  -o cmd,pid,ppid | awk -v shell=$SHELLPID  '$NF~shell'   

Qui, otteniamo il PID della shell dalla variabile speciale $$in SHELLPID, che può quindi essere utilizzato da awk nella subshell di pipe. In sostanza, stiamo semplicemente elencando i processi in forma NAME, PID, PID padre e filtriamo solo quelli che hanno il PID appropriato nell'ultima colonna.


1

Se hai avviato un processo nel terminale (ad es. Gedit) rispetto a ID processo (PID) (di bash) e ID processo padre (PPID) (di gedit) per questi due processi saranno gli stessi. Questo può essere visto nell'output di

ps -ef

comando. Per renderlo più leggibile, prima "reindirizza" l'output a grepper trovare il PID di tutti i processi "bash" attualmente in esecuzione e quindi "reindirizzalo" nuovamente awk. I awkseleziona solo il PID e campi di nome processo (campo 2 e 8) e uscite allo schermo.

ps -ef | grep bash | awk '{print $2 ": " $8}'

Il numero nell'output è PID. Lo userai per trovare quale processo è stato avviato nel terminale con quel PID. Si noti che può esserci più di una linea di output se si dispone di più di un terminale aperto. Ora per trovare i processi "figlio" (se presenti) di quelle sessioni terminali possiamo usare questo comando:

ps -ef | awk '{if ($3 == EnterPID) print $2 ": " $8;}'

È necessario inserire il numero PID al posto di EnterPID nell'ultimo comando. Se esiste più di un PID per "bash", devi provarli tutti.

L'ultimo comando guarda solo l'output di ps -efe cerca se PID (che hai trovato dal comando precedente) e PPID sono gli stessi per qualsiasi processo.

Ulteriori informazioni:

man ps

amico


-1

È possibile utilizzare htop. In Ubuntu 16.04 (e versioni successive), puoi installarlo semplicemente digitando sudo apt-get install htop.

Puoi anche usare top.


E come identifichereste i processi nell'attuale terminale usando htop?
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.