원격으로 종료하고 싶은 프로세스가 있습니다. 나는 노력했다
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
. 이스케이프 처리하거나 here-string을 사용해야 합니다.
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'"