ps, awk, xargs의 출력을 종료하는 sudo

ps, awk, xargs의 출력을 종료하는 sudo

프로세스 이름에 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

이미 언급했듯이 귀하의 친구는 다음 pgreppkill같습니다.

sudo pkill `pgrep -u root foo`

pgrep어떤 이유로 and 가 없으면 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}')

관련 정보