sudo, чтобы убить вывод ps, awk, xargs


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 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.

2
В вашей системе нет pkill?
Cry Havok

Что вы пытались (чтобы заставить это работать)? Стандартная техника устранения неполадок: разберитесь, чтобы увидеть, какие части не ведут себя так, как вы ожидаете. Есть ли ps aux | grep "[f]oo" показать вам процессы, которые вас интересуют? Есть ли ps aux | grep "[f]oo" | awk '{print $2}' показать свои PID? (П.С. рекомендую ставить [f]oo в кавычках.)
Scott

Так как насчет ps aux | grep "[f]oo" | awk '{print $2}' | xargs /bin/echo kill –15?
Scott

А что ты имеешь в виду? awk а также xargs игнорируются »? Вы получаете сообщения об ошибках, о которых вы нам не сообщаете?
Scott

Если я запускаю команды без «| kill», вывод на экран не форматируется awk. sudo sh -c "ps aux | grep [f] oo | awk '{print $ 2}' | xargs
Dave

Ответы:


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

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 }'"


Очень полезно, большое спасибо
Dave

1

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

sudo kill -15 $(ps aux | grep '[f]oo' | awk '{print $2}')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.