Я хочу завершить процессы, принадлежащие пользователю root, содержащие foo в имени процесса
sudo sh -c "ps aux | grep [f]oo | awk '{print $2}' | xargs kill -15"
эта команда не выполняется, так как awk и xargs игнорируются.
sudo sh -c "ps aux | grep [f]oo | awk '{print $2}' | xargs kill -15"
поэтому kill получает плохие аргументы
kill pid ... Send SIGTERM to every process listed.
kill signal pid ... Send a signal to every process listed.
kill -s signal pid ... Send a signal to every process listed.
kill -l List all signal names.
kill -L List all signal names in a nice table.
kill -l signal Convert between signal numbers and names.
решение1
Это отвратительный хак, и kill
на него будут жаловаться, но он работает (по крайней мере, у меня):
sudo kill `ps -ae | grep foo` &>/dev/null
Эта &>/dev/null
часть необязательна; включите ее, если вы не хотите видеть все kill
жалобы пользователя.
Я знаю, что, возможно, есть способ лучше, но я пользуюсь именно этим.
решение2
Как уже упоминалось pgrep
, pkill
ваши друзья:
sudo pkill `pgrep -u root foo`
Если по какой-то причине у вас нет pgrep
и pkill
, вы можете сделать что-то вроде этого:
for n in $(ps -u root | grep foo | cut -d ' ' -f 2); do sudo kill $n; done
решение3
Я считаю, что ваша настоящая проблема заключается в кавычках. В двойных кавычках $2 раскрывается еще до того, как он будет передан в sh. Одинарные кавычки, используемые в вашем коде, не изолируют это, потому что они просто символы кавычек. Попробуйте один из этих методов кавычек:
sh -c 'ps aux | grep [f]oo | awk '\''{ print $2 }'\'
sh -c $'ps aux | grep [f]oo | awk \'{ print $2 }\''
sh -c "ps aux | grep [f]ox | awk '{ print \$2 }'"
решение4
Таким образом вы избежите проблем с двойными кавычками. Результат должен быть тем же.
sudo kill -15 $(ps aux | grep '[f]oo' | awk '{print $2}')