Jak znaleźć wciąż działające procesy w terminalu?

13

Kiedy próbuję zamknąć kartę w Gnome Terminal, mówi:

Zamknąć ten terminal? W tym terminalu nadal działa proces. Zamknięcie terminalu go zabije.

Jak mogę dowiedzieć się, co nadal działa? Zauważ, że nie ma nic w danych wyjściowych jobs. Dzięki.

Tim
źródło
1
Jeśli pojawi się monit powłoki, gdy ten komunikat jest wyświetlany, prawdopodobnie jest to zagnieżdżona powłoka (nie ta uruchomiona bezpośrednio przez emulator terminala). Być może już rozpoczął screen, tmux, script, ssh, mci odwrócił się panele, czy tylko kolejny przykład Shell od typowania bash, lub coś wzdłuż tych linii. Naciśnij Ctrl + D lub wpisz, exitaby wyjść z powłoki, zobaczysz, gdzie skończysz.
egmont
Dzięki. potem exitkarta terminalu gnome nie zamyka się.
Tim
1
Sekund exitprawdopodobnie go wtedy zamknie. @egmont, możesz przenieść to do odpowiedzi, proszę.
Videonauth

Odpowiedzi:

13
ps T

Wybiera wszystkie procesy związane z terminalem.

tmcp
źródło
Dobrze, choć może być nieco mylące. Procesy spawnowane za pomocą nohuppolecenia są odłączone od terminala, więc nie blokuj jego zamykania. Ale nadal są wymienione za pomocą tego polecenia.
Sergiy Kolodyazhnyy
Lub po prostu ps w tym przypadku
użytkownik10089632
2

Możesz zdobyć szczyt w procesach, które wymieniają PID twojej powłoki jako nadrzędną. Jak możesz wiedzieć, możemy określić psformat

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

Tutaj otrzymujemy PID powłoki ze specjalnej zmiennej $$na SHELLPID, która następnie może być użyta przez awk w podpowłoce potoku. Zasadniczo wymieniamy tylko procesy w postaci NAZWA, PID, nadrzędny PID i odfiltrowujemy tylko tych, którzy mają odpowiedni PID w ostatniej kolumnie.

Sergiy Kolodyazhnyy
źródło
2

Jeśli uruchomiłeś jakiś proces w terminalu (np. Gedit) niż ID procesu (PID) (bash) i ID procesu nadrzędnego (PPID) (gedit) dla tych dwóch procesów będą takie same. Można to zobaczyć na wyjściu

ps -ef

Komenda. Aby był bardziej czytelny, najpierw „potokuj” wyjście, aby grepznaleźć PID wszystkich aktualnie uruchomionych procesów „bash”, a następnie „potokuj” go ponownie awk. W awkwybiera tylko PID i pola nazwę procesu (pole 2 i 8), i przekazuje je na ekranie.

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

Liczba na wyjściu to PID. Użyjesz go, aby znaleźć proces rozpoczęty w terminalu, który ma ten PID. Zauważ, że może być więcej niż jeden wiersz wyjścia, jeśli masz więcej niż jeden terminal otwarty. Teraz, aby znaleźć procesy „potomne” (jeśli w ogóle) tych sesji terminalowych, możemy użyć tego polecenia:

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

Musisz podać numer PID zamiast EnterPID w ostatnim poleceniu. Jeśli dla „bash” istnieje więcej niż jeden PID, musisz wypróbować je wszystkie.

Ostatnie polecenie po prostu sprawdza dane wyjściowe ps -efi sprawdza, czy PID (znaleziony w poprzednim poleceniu) i PPID są takie same dla dowolnego procesu.

Więcej informacji:

człowiek ps

człowiek awk

NonStandardModel
źródło
-1

Możesz użyć htop. W Ubuntu 16.04 (i nowszych) możesz go zainstalować, pisząc sudo apt-get install htop.

Możesz także użyć top.

Rangerix
źródło
A w jaki sposób identyfikowałbyś procesy w bieżącym terminalu za pomocą htop?
muru