4

Я хочу убить корневые процессы, содержащие 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.

4 ответа4

1

Таким образом, вы можете избежать двойных кавычек. Результат должен быть таким же.

sudo kill -15 $(ps aux | grep '[f]oo' | awk '{print $2}')
1

Я считаю, что ваша настоящая проблема заключается в цитировании. В двойных кавычках $ 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 }'"

1

Это безобразный хак, и kill будет жаловаться, но это работает (по крайней мере, для меня):

sudo kill `ps -ae | grep foo` &>/dev/null

Часть &>/dev/null является необязательной; включите его, если вы не хотите видеть все жалобы на kill .

Я знаю, что, возможно, есть лучший способ сделать это, но это то, что я использую.

1

Как уже упоминалось, 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .