
제 명령에서 오류를 찾을 수 없습니다.
ssh -t root@$machine -x "sshpass -p 'ubuntu' ssh -t root@$address -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/nul -x 'ps -ef | grep "myprocess" | awk {print $2} | xargs kill'"
이 오류가 있습니다.
awk: line 2: missing } near end of file
아이디어가 있나요?
답변1
이러한 유형의 문제의 경우 일반적으로 다음과 같이 시작하는 것이 가장 좋습니다.그것을 구성 부분으로 나누는 것입니다.신호를 보내기 위해 모든 PID를 얻는 것을 목표로 하는 가장 안쪽 표현식부터 시작하여 myprocess
바깥쪽으로 작업하면서 각 단계를 테스트하여 예상한 출력을 제공하는지 확인합니다.
ps
의 출력을 가져와 프로세스를 파악하고 출력을 실행하여 awk
관련 PID를 추출한 다음 xargs에 전달하여 이 작업을 수행합니다 . 당신이 실제로 어떤 사람인지 살펴보면성취하려고 노력하는 중당신이 겪고 있는 구체적인 문제보다는이를 수행하는 훨씬 더 좋은 방법이 적어도 두 가지 있습니다.또한 우연히도 직면하고 있는 문제를 완전히 피할 수 있습니다(단일 복합 명령 내에서 여러 개의 인용 레이어를 기반으로 함).
하나는 을 유지 ps
하고 해당 -C
및 -o
매개변수를 사용하여 관심 있는 정보만 가져오는 것입니다. 이는 실제로 ps(1) 매뉴얼 페이지에 예로 언급되어 있습니다. 그런 다음 다음을 원할 것입니다.
ps -C myprocess -o pid=
이미지 이름이 있는 모든 프로세스의 PID만 인쇄합니다 myprocess
. 그런 다음 xargs로 간단하게 파이프하여 다음 ps ... | xargs kill
으로 바꿀 수 있습니다.
ps -C myprocess -o pid= | xargs kill
또는 파이프와 xargs를 완전히 피하기 위해 프로세스 대체를 사용할 수도 있습니다.
kill $( ps -C myprocess -o pid= )
그만큼더 나은 대안killall
주어진 이미지 이름을 가진 모든 프로세스에 직접 신호를 보내는 데 사용됩니다 .
killall -e myprocess
여기에서는 -e
프로세스 이미지 이름이 정확히 일치하는 "정확" 모드를 지정합니다. 이 경우 ps ... | xargs kill
위의 내용으로 전체를 교체하세요.
-o UserKnownHostsFile=/dev/nul
아, 그리고 일반적인 이름은 /dev/nul이 아니라 /dev/null입니다. NUL
1970년대 중반의 CP/M-ism은 Microsoft가 현재 Windows 버전에 도입한 것입니다. 이 특별한 경우에는 귀하의 엄격한 정도에 따라 효과가 동일할 수도 있고 동일하지 않을 수도 있습니다 ssh
.