프로세스 이름에 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
어떤 이유로 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}')