비밀번호 없는 SSH를 통해 연결된 컴퓨터 클러스터가 있고 클러스터 전체에서 명령을 실행할 수 있는 유틸리티를 작성했습니다. 이는 파일에 있는 머신을 선택하고 SSH를 통해 지정된 명령을 실행하는 동안 이를 반복하여 구현됩니다.
이제 클러스터에서 kill 명령을 실행하고 싶습니다. 내가 수행하는 방법은 grep
프로세스 ID를 가져온 다음 다음과 같이 Kill 명령을 실행하는 것입니다.
kill -9 $(ps -ef | grep service_name | awk '{print $2}')
하지만 이 명령을 실행하면 한 컴퓨터에서 루프를 실행하고 명령을 실행한 다음 두 번째 컴퓨터에서 루프를 반복한 다음 명령을 실행하지도 않고 종료됩니다. 따라서 명령은 하나의 시스템에서만 실행됩니다.
나는 약간의 독서를 했고 cmd1 $(cmd2)
SSH를 통해 실행되는 하위 쉘 명령이 올바르게 실행되지 않는다는 것을 발견했습니다.
누구든지 나에게 해결책을 제공할 수 있습니까?
답변1
실제로 명령 대체(서브쉘뿐만 아니라)는 잘 작동합니다. 문제는 종료하려는 프로세스가 원격 시스템의 프로세스이기 때문에 원격 시스템의 원격 쉘에서 실행되기를 원한다는 것입니다. 따라서 이를 인용해야 합니다. 이는 약간 투박하지만 grep
두 awk
가지 옵션이 있습니다.
ssh user@remote "kill -9 \$(ps -ef | awk '/service_name/{print $2}')"
ssh user@remote 'kill -9 $(ps -ef | awk "/service_name/{print \$2}")'
그러나 대부분의 Linux 및 일부(?) 다른 Unix에서 이 문제에 대한 더 나은 해결책은 pkill
특정 명령을 실행하는 프로세스를 검색하여 종료하는 것입니다.
ssh user@remote pkill -9 service_name
프로세스가 시작된 방법에 따라 전체 명령줄을 검색해야 할 수도 있습니다.
ssh user@remote pkill -f -9 service_name
답변2
grep을 awk로 파이프하면 안 됩니다!
ps -ef | awk '/service_name/ { print $2}' | xargs kill -9
또는
pkill service_name
답변3
노력하다:
ps -ef | grep service_name | awk '{print $2}' | xargs kill -9
이것을 먼저 테스트해 볼 수도 있습니다.
답변4
kill -9 $(ps -ef | awk "/service_name/{print \$2}")
명령을 "`" 문자로 감싸고 유틸리티를 사용하여 실행했는데 정말 매력적이었습니다. 마지막 명령은 다음과 같습니다.
`kill -9 $(ps -ef | awk "/service_name/{print \$2}")`