SSH를 통해 원격 프로세스 종료

SSH를 통해 원격 프로세스 종료

원격으로 종료하고 싶은 프로세스가 있습니다. 나는 노력했다

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

관련 정보