Может ли ps отображать только неядерные процессы в Linux?

Как я могу попросить ps отображать только пользовательские процессы, а не потоки ядра?

Смотрите этот вопрос, чтобы понять, что я имею в виду …

  • Странное поведение «ps aux» в столбце времени процессора
  • Получите максимальное использование ЦП для процесса
  • Где найти исходный код для ps?
  • Понимание «vncserver -list» в отношении процессов Xvnc
  • Как определить исполняемый путь с его PID на AIX 5 или более
  • Разница между poll_s и ep_poll WCHAN в выпуске ps
  • Что указывает этот STAT-процесс?
  • Какие процессы используются DRM?
  • 6 Solutions collect form web for “Может ли ps отображать только неядерные процессы в Linux?”

    Это должно сделать (под Linux):

     ps --ppid 2 -p 2 --deselect 

    kthreadd (PID 2) имеет PPID 0 ( на Linux 2.6+ ), но ps не позволяет фильтровать PPID 0; таким образом, это обход.

    Одним из способов распознавания процессов ядра является то, что они не используют пользовательскую память, поэтому поле vsz равно 0. Это также ловит зомби (благодаря Стефану Шазеласу за это наблюдение), которые можно устранить в зависимости от их статуса.

     ps axl | awk '$7 != 0 && $10 !~ "Z"' 

    Чтобы указать только PID:

     ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}' 

    Одна из особенностей этих процессов заключается в том, что они не подкреплены исполняемым файлом, поэтому вы можете сделать ( в zsh ):

     ps /proc/[0-9]*/exe(^-@:h:t) 

    Или с любой оболочкой POSIX:

     ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)" 

    Это проверка процессов, /proc/<pid>/exe – ссылка на файл.

    Но это означает, что вам нужно быть суперпользователем, чтобы проверить состояние /proc/<pid>/exe .

    Изменить : Как это происходит, процессы зомби (по крайней мере) удовлетворяют одному и тому же условию, поэтому, если вы не хотите, чтобы они были исключены, вам придется добавить их обратно. Подобно:

     ps -p "$( { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 ps -eo pid=,state= | sed -n 's/ Z//p' } | paste -sd , -)" 

    Обратите внимание, что ps -f показывает имена процессов в квадратных скобках не потому, что они являются процессами ядра, а потому, что они имеют пустой argv[] (поэтому ps показывает имя процесса вместо argv[0] ). У вас может быть и пользовательский пространственный процесс с пустой argv[] и вы можете иметь имя процесса с argv[0] , имеющее форму [some-string] поэтому фильтрация вывода ps на основе этих квадратных скобок не является надежный опция.

    На практике я нашел следующую идиому:

     ps auxf | grep -v ]$ 

    Он фильтрует строки, заканчивающиеся на скобки, что может привести к пропущению нежелательных записей, но это очень маловероятно. Взамен это довольно легко запомнить и относительно быстро напечатать.

    Некоторые процессы, такие как avahi-daemon, добавляют к их именам имя процесса в скобках (имя хоста в случае avahi-daemon) и будут отфильтрованы этой командой.

    Для тех, кто пытается это делать в busybox, где ps сильно упрощается, а выход отличается, этот вариант отличного ответа Gilles хорошо работает:

     ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"' 

    Согласно ответам Гилла, методология здесь состоит в том, чтобы найти процессы, которые не используют какую-либо пользовательскую память (`vsz col == 0), и отфильтровывать процессы зомби (статус col не является« Z »).

    Выводимые столбцы можно легко отрегулировать, если соответствующие номера полей awk на основе 1 будут соответствующим образом скорректированы. Посмотрите варианты, доступные вашим ps, добавив фиктивные значения, и он вам скажет. Например:

     $ ps -o foo ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss 

    Вы также можете просто проанализировать вывод ps и искать имена процессов, которые не указаны в скобках:

     ps aux | awk '$NF!~/^\[.+\]$/' 
    Linux и Unix - лучшая ОС в мире.