
원격으로 종료하고 싶은 프로세스가 있습니다. 나는 노력했다
ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"
하지만 이것은 오류를 반환합니다
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
그러나 따옴표 안에 명령을 실행하면
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
원격 호스트에서는 잘 작동합니다. 여기서 뭔가 빠졌나요?
답변1
로컬 쉘에 의해 확장되므로 명령 $(..)
대체가 실패합니다 .$
~ 전에이는 명령으로 전달 stdin
됩니다 ssh
. 이스케이프 처리하거나 여기 문자열을 사용해야 합니다.
awk
또한 해당 인쇄 내부의 명령은 $2
명령줄 인수로 보간됩니다. 따라서 명령이 원격으로 실행될 때까지 확장을 연기하기 위해 이스케이프 처리합니다.
탈출로,
ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"
또는 여기 문서를 사용하여
ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF
또한 그것은 grep .. | grep .. | awk
불필요하다는 점에 유의하십시오. 혼자서 모든 작업을 수행할 수 있습니다 awk
. 또는 pkill
이름으로 직접 프로세스를 종료하는 데 사용하는 것이 더 좋습니다 .
답변2
이것은 호스트 세트를 죽이는 데 효과적이었습니다.
for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done
답변3
선택적으로 다음과 같은 작업을 수행할 수 있습니다.
ssh remotehost "killall -r 'foo.*bar'"