Как я могу попросить ps
отображать только пользовательские процессы, а не потоки ядра?
Посмотрите на этот вопрос, чтобы понять, что я имею в виду ...
Как я могу попросить ps
отображать только пользовательские процессы, а не потоки ядра?
Посмотрите на этот вопрос, чтобы понять, что я имею в виду ...
Это должно сделать (под Linux):
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) имеет PPID 0 ( в Linux 2.6+ ), но ps
не позволяет фильтровать PPID 0; таким образом это обходной путь.
kthreadd
всегда PID 2?kthreadd
, а затем построить соответствующийps
вызов. Насколько гарантировано, что эта вещь будет «всегда» называться «kthreadd»? Безопасное решение было бы более сложным, работало быps
нормально и анализировало выходные данные, возможно, сделайте несколько тестов.x
флаг, который не работает с этим.ps au --ppid 2 -p 2 --deselect
работает нормально.Один из способов распознать процессы ядра - это то, что они не используют какую-либо пользовательскую память, поэтому поле vsz равно 0. Это также ловит зомби (спасибо Стефану Чазеласу за это наблюдение), которые могут быть удалены в зависимости от их статуса.
Чтобы перечислить только PID:
источник
На практике я нашел следующую идиому:
Он фильтрует строки, заканчивающиеся скобками, что может привести к пропуску нежелательных записей, но это очень маловероятно. В обмен на это довольно легко запомнить и относительно быстро набрать.
Некоторые процессы, такие как avahi-daemon, добавляют к своим именам процессов информацию в скобках (имя хоста в случае avahi-daemon) и будут отфильтрованы этой командой.
источник
Одна из особенностей этих процессов заключается в том, что они не поддерживаются исполняемым файлом, так что вы можете сделать ( в zsh ):
Или с любой оболочкой POSIX:
Это проверка процессов, чья
/proc/<pid>/exe
ссылка на файл.Но это означает, что вы должны быть суперпользователем, чтобы иметь возможность проверять состояние
/proc/<pid>/exe
символической ссылки.Изменить : Как это происходит, процессы зомби (по крайней мере) удовлетворяют тому же условию, поэтому, если вы не хотите, чтобы они были исключены, вам придется добавить их обратно. Подобно:
Обратите внимание, что
ps -f
имена этих процессов отображаются в квадратных скобках не потому, что они являются процессами ядра, а потому, что они имеют пустое значениеargv[]
(поэтому ps показывает имя процесса вместоargv[0]
этого). У вас также может быть процесс в пространстве пользователя с пустым,argv[]
а у вас может быть имя процесса сargv[0]
формой,[some-string]
поэтому фильтрацияps
вывода на основе этих квадратных скобок не является надежной опцией.источник
zsh
синтаксис. Второй - это стандартный синтаксис POSIXsh
(и,ps
и,find
и,cut
иpaste
). Конечно,/proc
это не указано в POSIX.wc -l
). Ну, тогда я приму ответ Хауке Лагинга и дам вам голос. ;)Вы также можете просто проанализировать
ps
вывод и найти имена процессов, которые не заключены в квадратные скобки:источник
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- но вы все равно получите процессы, которые упоминают любое такое имя пользователя, и оставите временный файл без дела. Я отзову свое отрицательное голосование, но только потому, что ваше третье решение разумно.$NF
это последнее слово командной строки вps aux
выводе. Неядерные процессы могут быть[...]
там. Как я сказал в своем ответе,[xxx]
нотация не потому, что они являются процессами ядра, а потому, что у них нет командной строки (без аргументов), которая также допускается для процессов, не связанных с ядром.Для любого, кто пробует это в busybox, где
ps
сильно упрощено и вывод отличается, этот вариант отличного ответа Жиля хорошо работает:Согласно ответу Жиля, методология здесь состоит в том, чтобы найти процессы, которые не используют пользовательскую память (`vsz col == 0), и отфильтровать процессы зомби (статус col не равен 'Z').
Выходные столбцы могут быть легко отрегулированы при условии, что номера полей awk на основе 1 настроены соответствующим образом. Посмотрите варианты, которые ваш ps имеет, введя фиктивное значение, и оно сообщит вам. Например:
источник
Если вам нужны только подсчеты ... У меня была аналогичная необходимость фильтровать ядро и пользовательские процессы, но мне нужны были только соответствующие подсчеты для каждого. Это было мое решение:
Образец вывода :
Объяснение : Я использую хак, что процессы VSZ = 0 можно считать процессами ядра. Итак
awk
, я оцениваю сравнение VSZ (сps -eo vsize
), равно ли оно нулю. Результатом сравнения будет либо логическое значение 0, либо 1. Я создаю массивp[]
, и, когда я запускаю список процессов, если это процесс ядра, я увеличиваю егоp[1]++
. В противном случае, как пользовательский процесс, я увеличиваюp[0]++
. После всех приращений я помечаю и печатаю значения (то есть подсчитывает) для p [0] и p [1] вEND { }
блоке.источник
То, что вы ищете, друг мой, нет
ps
, ноpstree
.Сначала определите первый процесс ядра. Его PID обычно равен 1 в системе без systemd и 2 в systemd.
Затем используйте эту команду:
Выбранный ответ (один с ✅) использует другую команду:
Проблема этой
ps
команды в том, что она включает в себя только прямых потомков, но не всех потомков. Командаpstree
включает в себя всех потомков. Вы можете сравнить и посчитать вывод этих двух команд (простой способ использования| wc
) для проверки.источник
Я создал скрипт psa для этой цели. Обратите внимание, что это зависит от инструмента linechop .
источник