Как я могу сделать pgrep -U someUserName
используя только ps
и grep
? Т.е. не рассчитывать на установку pgrep
в системе?
1 ответ
В одну сторону:
ps -U someUserName -o pid,comm | awk '/someProcessName/{print $1}'
Обратите внимание, что вы можете получить несколько идентификаторов процессов в качестве выходных данных, если запущено несколько процессов, соответствующих имени пользователя и процесса.
Вывод ps
действительно сделан для удобочитаемого представления, а не для такой обработки. Существуют и другие инструменты для предоставления более низкого уровня доступа к списку процессов в формате, лучше подходящем для написания сценариев, например, библиотеки pgrep
, Perl/Python/... и так далее.
Чтобы сделать это, используя только ps
и grep
как вы просите, можно сделать
ps -U someUserName -o pid,comm | grep 'someProcessName' | grep -oE '^ *([^ ]*)'
Это будет включать начальные пробелы, но это должно быть проблемой в приложении, например
for i in $(ps -U someUserName -o pid,comm | grep 'someProcessName' | grep -oE '^ *([^ ]*)'); do
kill $i
done
должно сработать.
Но, как я уже сказал, pkill
- более правильный и надежный способ, и он должен быть широко доступен.