sudo для уничтожения вывода ps, awk, xargs

sudo для уничтожения вывода ps, awk, xargs

Я хочу завершить процессы, принадлежащие пользователю 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}')

Связанный контент