По умолчанию, владелец и группа /usr/local
и все подкаталоги (включая bin
) должен быть root.root
и полномочия должны быть rwxr-xr-x
. Это означает, что пользователи системы могут читать и выполниться в (и от) эта структура каталогов, но не могут создать или отредактировать файлы там. Только root
учетная запись (или администратор, использующий sudo
) должен смочь создать и отредактировать файлы в этом месте. Даже при том, что существует только один пользователь в системе, это обычно - плохая идея изменить полномочия этой структуры каталогов к перезаписываемому любому пользователю кроме root
.
Я предложил бы поместить Ваш сценарий/двоичный файл/исполняемый файл в /usr/local/bin
использование корневой учетной записи. Это - хорошая привычка войти. Вы могли также поместить сценарий/двоичный файл/исполняемый файл в $HOME/bin и удостовериться, что $HOME/bin находится в Вашем $PATH.
Посмотрите этот вопрос для большего количества обсуждения: Куда локальный исполняемый файл должен быть помещен?
Это должно сделать (в соответствии с Linux):
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) имеет PPID 0 (на Linux 2.6 +), но ps
не позволяет фильтровать для PPID 0; таким образом это обходное решение.
Один способ распознать процессы ядра состоит в том, что они не используют пользовательской памяти, таким образом, 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}'
Одна из особенности тех процессов - то, что они не поддерживаются исполняемым файлом, таким образом, Вы могли сделать (в 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
вывод на основе тех квадратных скобок не является надежной опцией.
zsh
синтаксис. Вторым является стандартный POSIX sh
(и ps
и find
и cut
и paste
) синтаксис. Конечно, /proc
не указан POSIX.
– Stéphane Chazelas
07.06.2013, 17:42
wc -l
). Ну, я приму ответ Hauke Laging затем и дам Вам upvote. ;)
– Totor
10.06.2013, 01:41
Вы могли также просто проанализировать ps
вывод и ищет имена процесса, которые не в скобках:
ps aux | awk '$NF!~/^\[.+\]$/'
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- но Вы все еще получите процессы, которые упоминают любое такое имя пользователя, и Вы разбросаете временную ложь файла. Я заберу свой downvote, но только потому, что Ваше третье решение разумно.
– Keith Thompson
07.06.2013, 23:31
$NF
последнее слово командной строки в ps aux
вывод. Процессы неядра могут иметь [...]
там. Поскольку я сказал в своем ответе [xxx]
нотация - то, не потому что они - процессы ядра, но потому что у них нет командной строки (никакой аргумент), который также позволяется процессов неядра.
– Stéphane Chazelas
08.06.2013, 01:44
На практике я нашел следующую идиому достаточно:
ps auxf | grep -v ]$
Это фильтрует строки, заканчивающиеся скобками, которые могли бы закончиться, опустив нежелательные записи, но это очень маловероятно. В обмен довольно легко помнить и относительно быстрый для ввода.
Некоторые процессы как avahi-демон добавляют к своей информации об имени процесса в скобках (имя хоста в случае avahi-демона) и будут отфильтрованы этой командой.
Для тех, кто пробует это в 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
То, что ты ищешь, друг мой, не 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
)для проверки.
kthreadd
всегда PID 2? – l0b0 07.06.2013, 18:21kthreadd
, затем создайте соответственноps
звонить. Насколько гарантируемый это, что эту вещь будут "всегда" называть "kthreadd"? Безопасное решение было бы более сложным, работало быps
обычно и синтаксический анализ вывод, сделайте некоторые тесты, возможно. интересный – Hauke Laging 07.06.2013, 18:38