Как найти все еще запущенные процессы в терминале?

12

Когда я пытаюсь закрыть вкладку в Gnome Terminal, она говорит:

Закрыть этот терминал? В этом терминале все еще выполняется процесс. Закрытие терминала убьет его.

Как я могу узнать, что еще работает? Обратите внимание, что в выводе ничего нет jobs. Спасибо.

Тим
источник
1
Если при отображении этого сообщения вы находитесь в приглашении оболочки, возможно, это вложенная оболочка (а не та, которая запускается непосредственно эмулятором терминала). Может быть , вы начали screen, tmux, script, ssh, mcи перевернул панели от, или просто другой оболочки , например , набрав bash, или что - то вдоль этих линий. Нажмите Ctrl + D или введите, exitчтобы выйти из вашей оболочки, вы увидите, где вы оказались.
egmont
Спасибо. после exitэтого вкладка терминала gnome не закрывается.
Тим
1
Второй exit, вероятно, закроет его тогда. @egmont Вы можете переместить это в ответ, пожалуйста.
Видеонавт

Ответы:

12
ps T

Выбирает все процессы, связанные с терминалом.

TMCP
источник
Хорошо, хотя может быть немного обманчиво. Процессы, созданные по nohupкоманде, отключаются от терминала, поэтому не блокируйте его закрытие. Но они все еще перечислены с этой командой.
Сергей Колодяжный
Или просто ps в этом отношении
user10089632
1

Вы можете оценить процесс, в котором PID вашей оболочки указан как родительский. Как вы можете или не можете знать, мы можем указать psформат

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

Здесь мы получаем PID оболочки из специальной переменной $$into SHELLPID, которая затем может использоваться awk в subshell канала. По сути, мы просто перечисляем процессы в форме NAME, PID, Parent PID и отфильтровываем только тех, кто имеет соответствующий PID в последнем столбце.

Сергей Колодяжный
источник
1

Если вы запустили какой-то процесс в терминале (например, gedit), то идентификатор процесса (PID) (из bash) и идентификатор родительского процесса (PPID) (из gedit) для этих двух процессов будут одинаковыми. Это можно увидеть на выходе

ps -ef

команда. Чтобы сделать его более читабельным, давайте сначала «передадим» вывод, чтобы grepнайти PID всех запущенных в настоящее время процессов «bash», а затем снова передаем «по конвейеру» awk. В awkвыбирает только PID и имя процесса полей (поле 2 и 8) , и выводит его на экран.

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

Число на выходе - PID. Вы будете использовать его, чтобы узнать, какой процесс был запущен в терминале с этим PID. Обратите внимание, что может быть более одной строки вывода, если у вас открыто более одного терминала. Теперь, чтобы найти «дочерние» процессы (если таковые имеются) этих терминальных сессий, мы можем использовать эту команду:

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

Вы должны ввести номер PID вместо EnterPID в последней команде. Если для «bash» существует более одного PID, вы должны попробовать их все.

Последняя команда просто просматривает выходные данные ps -efи ищет, совпадают ли PID (который вы нашли из предыдущей команды) и PPID для любого процесса.

Больше информации:

человек пс

человек awk

NonStandardModel
источник
-1

Вы можете использовать htop. В Ubuntu 16.04 (и выше) вы можете установить его, просто набрав sudo apt-get install htop.

Вы также можете использовать top.

Rangerix
источник
И как бы вы определили процессы в текущем терминале, используя htop?
Муру