Я ищу, запущен ли определенный процесс под определенным пользователем. Для чего я могу сделать это
ps --no-headers -C command -o user | grep user
Это довольно удобно, однако становится немного некрасиво, если я затем захочу вывести аргументы (что может помешать grep для имени пользователя!)
ps --no-headers -C command -o user,pid,comm | egrep \^user
Это было бы еще хуже, если бы я не хотел, чтобы пользователь был первым или последним столбцом. Было бы аккуратнее, если бы я мог указать опции -C и -U в PS, как это
ps --no-headers -C command -U user -o pid
Однако это не работает, так как два предложения действуют как ИЛИ, а не И. Есть ли какая-то функция 'ps', которую я упускаю, или, может быть, другой аккуратный однострочник, который я мог бы использовать? Ура!
решение1
pgrep
поддерживает различные состояния:
pgrep -x -u "user" "command"
Замените -x
на -f
, чтобы также сопоставить аргументы; добавьте -l
для отображения командной строки.
Вы также можете прочитать командную строку напрямую (разделенную нулем):/proc/PID/cmdline
if pids=$(pgrep -x -u "user" "command"); then
for pid in $pids; do
tr "\0" " " < /proc/$pid/cmdline; echo
done
fi