PS может отобразить только не процессы ядра на Linux?

По умолчанию, владелец и группа /usr/local и все подкаталоги (включая bin) должен быть root.root и полномочия должны быть rwxr-xr-x. Это означает, что пользователи системы могут читать и выполниться в (и от) эта структура каталогов, но не могут создать или отредактировать файлы там. Только root учетная запись (или администратор, использующий sudo) должен смочь создать и отредактировать файлы в этом месте. Даже при том, что существует только один пользователь в системе, это обычно - плохая идея изменить полномочия этой структуры каталогов к перезаписываемому любому пользователю кроме root.

Я предложил бы поместить Ваш сценарий/двоичный файл/исполняемый файл в /usr/local/bin использование корневой учетной записи. Это - хорошая привычка войти. Вы могли также поместить сценарий/двоичный файл/исполняемый файл в $HOME/bin и удостовериться, что $HOME/bin находится в Вашем $PATH.

Посмотрите этот вопрос для большего количества обсуждения: Куда локальный исполняемый файл должен быть помещен?

42
13.04.2017, 15:36
8 ответов

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

ps --ppid 2 -p 2 --deselect

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

38
27.01.2020, 19:35
  • 1
    Хороший, но насколько гарантируемый это это kthreadd всегда PID 2? –  l0b0 07.06.2013, 18:21
  • 2
    @l0b0 я понятия не имею :-) Вы могли сделать это на двух шагах: Определите PID kthreadd, затем создайте соответственно ps звонить. Насколько гарантируемый это, что эту вещь будут "всегда" называть "kthreadd"? Безопасное решение было бы более сложным, работало бы ps обычно и синтаксический анализ вывод, сделайте некоторые тесты, возможно. интересный –  Hauke Laging 07.06.2013, 18:38
  • 3
    В Linux 2.4 на x86 дуге, по крайней мере, те процессы, имел ppid 1, так не мог быть отличен тот путь. –  Stéphane Chazelas 07.06.2013, 23:29
  • 4
    , чтобы быть похожим "на PS-ef" делает "PS - ppid 2-p 2 - отменяет выбор-f", и сделать он как "PS aux" делает "PS - ppid 2-p 2 - отменяет выбор u" –  Peter 08.08.2014, 14:22

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

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

Перечислять просто PIDs:

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'
9
27.01.2020, 19:35
  • 1
    Как мое решение, это будет также включать процессы-зомби. –  Stéphane Chazelas 10.06.2013, 14:52
  • 2
    @StephaneChazelas, я добавил условие к фильтру. –  Gilles 'SO- stop being evil' 10.06.2013, 15:09

Одна из особенности тех процессов - то, что они не поддерживаются исполняемым файлом, таким образом, Вы могли сделать (в 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 -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"

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

8
27.01.2020, 19:35
  • 1
    сервера VM, Это - нестандартный синтаксис оболочки, я считаю. –  Totor 07.06.2013, 17:28
  • 2
    @Totor, как я сказал, первый, zsh синтаксис. Вторым является стандартный POSIX shps и find и cut и paste) синтаксис. Конечно, /proc не указан POSIX. –  Stéphane Chazelas 07.06.2013, 17:42
  • 3
    , Принимающего этот ответ, потому что это универсально (спасибо за редактирование). Однако ответ Hauke Laging также довольно хорош и прост, пока Вы не имеете дело с 2,4 ядрами. –  Totor 08.06.2013, 22:12
  • 4
    @Totor, ответ Hauke также имеет преимущество не требования суперпользователя priviledge. Мой ответ работает с 2,4 и 2.6/3 ядра, но я предполагаю, что нет гарантии, это будет работать в 4.x так или иначе. –  Stéphane Chazelas 08.06.2013, 23:01
  • 5
    Хм, Вы правы, я не думал о полномочиях пользователя root. Это может привести к ошибкам, так как Вы все еще получаете ответ, когда Вы не корень, но это отличается (таким образом, необходимо быть осторожными при подсчете их с, сказать wc -l). Ну, я приму ответ Hauke Laging затем и дам Вам upvote. ;) –  Totor 10.06.2013, 01:41

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

ps aux | awk '$NF!~/^\[.+\]$/'
1
27.01.2020, 19:35
  • 1
    немного менее ненадежный способ получить список пользователей Вы интересуетесь: awk -F: '$7 ~ home { print $1 }' /etc/passwd - но Вы все еще получите процессы, которые упоминают любое такое имя пользователя, и Вы разбросаете временную ложь файла. Я заберу свой downvote, но только потому, что Ваше третье решение разумно. –  Keith Thompson 07.06.2013, 23:31
  • 2
    Вот еще Вы правы полностью, @KeithThompson, удалил другие, они не стоят того. Вы могли помочь мне очистить (теперь) устаревшие комментарии? –  terdon♦ 07.06.2013, 23:38
  • 3
    Отметьте это $NF последнее слово командной строки в ps aux вывод. Процессы неядра могут иметь [...] там. Поскольку я сказал в своем ответе [xxx] нотация - то, не потому что они - процессы ядра, но потому что у них нет командной строки (никакой аргумент), который также позволяется процессов неядра. –  Stéphane Chazelas 08.06.2013, 01:44

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

ps auxf | grep -v ]$

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

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

9
27.01.2020, 19:35

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

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

в соответствии с ответом на Жиль, методология здесь Найдите процессы, которые не используют какую-либо память пользователя (`vsz col == 0), и отфильтровать процессы зомби (статус col не" z ').

Выходные колонки могут быть легко отрегулированы, до тех пор, пока 1 на основе 1 находятся номера поля awk настраиваются соответственно. См. Варианты, которые ваш PS доступен, поместив поддельную ценность, и это скажет вам. Например:

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

То, что ты ищешь, друг мой, не ps, а pstree.

Сначала определите первый процесс ядра. Его PID обычно равен 1 в системе без systemd и 2 с systemd.

Затем используйте эту команду:

$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

Выбранный ответ (с ✅ )использует другую команду:

$ ps --ppid 2 -p 2 --deselect

Проблема с этой командой psзаключается в том, что она включает только прямых потомков, но не всех потомков. Команда pstreeвключает всех потомков. Вы можете сравнить и подсчитать вывод этих двух команд (, простой способ — использовать| wc)для проверки.

0
27.01.2020, 19:35

Для этой цели я создал скрипт psa . Обратите внимание, что это зависит от инструмента linechop .

0
27.01.2020, 19:35

Теги

Похожие вопросы