SSH를 통해 원격으로 사용할 수 있는 Linux 컴퓨터가 있습니다.플링크기계 에 Windows XP
. 자동 로그인을 사용하여 스크립트에서 명령을 실행하도록 Plink 프로그램을 설정했습니다.
plink -ssh [domain name] -l [username] -pw [password] -m commands.txt >> Outputtext.txt
commands.txt
다음 내용만 포함됩니다.
echo "Killing process"
ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1` | xargs kill -9
sleep 2
echo "Restarting process"
processd &
echo "Exiting..."
스크립트는 프로세스 이름을 검색하여 종료하고 다시 시작합니다. 스크립트를 실행하기 전에 Linux에서 프로세스가 실제로 시작되면 매번 작동합니다. 그러나 프로세스가 시작되지 않으면 실제로 제어 터미널을 종료하고 명령 plink.exe
에 따라 종료됩니다.ps -ef
범위를 좁혔고 이렇게 하면 ps -ef | grep 'processname'
두 개의 PID가 반환됩니다. 하나는 내가 검색 중인 프로세스이고 다른 하나는 grep processname PID 자체입니다.
프로세스가 시작되지 않으면 프로세스를 종료하고 어떻게 든 plink 연결을 종료하거나 터미널을 제어하는 것으로 grep 'processname'
가정하는 PID를 반환합니까? kill -9
이 문제를 해결할 방법이 있나요?
2줄을 반환 하면 프로세스가 시작되었음을 의미하는지 확인하거나 grep 'processname'
, 1줄만 있으면 종료하지 마세요.
echo "#!bash"
bash 스크립트를 출력한 다음 bash 스크립트를 실행할 수 있는지 확실하지 않습니까 ?
아니면 plink의 이상한 버그인가요?
답변1
귀하의 명령줄이 제 눈에는 정말 이상해 보입니다.
ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1 | xargs kill -9
awk
출력을 프로그램(예: 입력을 완벽하게 필터링할 수 있는 프로그램, 더 강력한 프로그램)에 공급 합니다grep
.awk
출력(즉, 출력을 완벽하게 필터링할 수 있는 프로그램)을head
.- 확실히
xargs
하나의 매개변수만 사용합니다.
따라서 더 나은 접근 방식(이 질문은 중복됨)과 관계없이 다음을 수정해야 한다고 생각합니다.
kill -9 $(ps -ef | awk '/processname/ {print $2;exit;}')
답변2
ps
관심 있는 정보만 출력하도록 검색 명령을 제한하세요 .
ps -C processname -o pid
하지만 실제로 무언가를 죽이기 전에 명령의 결과 코드를 확인하는 것이 좋습니다.