2012-10-10 4 views
4

백그라운드 프로세스를 시작하는 스크립트가 있습니다.쉘 스크립트에서 backgound 프로세스를 종료합니다.

#!/bin/sh 

./process1.sh & 
./process2.sh & 

별도의 스크립트를 사용하여 이러한 프로세스를 종료해야합니다. 는 여기에 내가 무슨 짓을 :

#!/bin/sh 
# the kill.sh 

pid=$(ps | grep './process1.sh' |grep -v grep| awk '{print $1}') 
kill -9 $pid 

질문 시간 :

  1. kill.sh이 프로세스가 들렸다있다라고합니다. 하지만 메시지가 나타납니다.

    "sh : 누구를 죽일 지 지정해야합니다." 왜 그럴까요?

  2. 설명 된 스크립트를 사용하여 프로세스를 종료 한 후에 즉시 멈추지 않습니다. 잠시 동안 프로세스가 여전히 실행중인 것처럼 화면에 결과가 표시됩니다. 어떤 아이디어?

  3. 프로세스를 죽일 수있는 대체 솔루션은 무엇이 있을까요?

내가 busybox와 함께 일하고 있다고 언급 할만한 가치가있는 유틸리티는 제한적입니다.

도움을 주시면 감사하겠습니다.

+0

당연히 이러한 스크립트를 작성한 방법에 따라 다르지만 시그널을 잡을 때 (살인을 수행 할 때) 신호를 받고 허용 된 작업을 수행하여 정상적으로 정리하거나 종료해야합니다. 또한/tmp 디렉토리의 임시 파일로 백그라운드에서 프로세스를 시작할 때 PID를 기록하십시오. ps 명령을 망칠 필요가 없습니다. – Anders

답변

4

이 같은 임시 파일에 프로세스 ID를 저장할 수 있습니다. $!은 마지막으로 실행 된 프로세스의 PID를 반환합니다.

kill -9 `cat /tmp/process*.pid` 
rm /tmp/process*.pid 

해당 스크립트가 완료된 후 process*.pid 파일이 삭제되는지 확인하십시오.

+0

감사합니다! 나와 일하는 것 같아. –

1

pid이 (가) 비어있어 사용자의 kill 명령이 실패했습니다.

pid=$(ps | grep './process1.sh' |grep -v grep| awk '{print $1}') 

이것은 원하는 pid를 제공하지 않습니다. 백그라운드에서 프로세스를 시작하면 새로운 셸에서 프로세스가 실행되고 'process.sh in your ps'출력이 표시되지 않습니다.

./process1.sh & 
pid1=$! # Save the previously started background's PID 
./process2.sh & 
pid2=$! # Save the previously started background's PID 

echo $pid1 " " $pid2 > /tmp/killfile 

그런 다음이 파일에서의 PID를 얻을 kill에 전달 :

은 당신이 할 수있는 것은 당신이 백그라운드 프로세스를 시작할 때의 PID를 저장하고 그들을 죽일 것입니다.

#!/bin/sh 

./process1.sh & 
echo $! > /tmp/process1.pid 
./process2.sh & 
echo $! > /tmp/process2.pid 

를 다음 스크립트를 삭제 :

+0

제안 해 주셔서 감사합니다. 시도해 보겠습니다. 한 가지 질문. 그것은 이상한데 내 pid가 비어 있어야한다고 말하고 있지만 그렇지 않습니다. 필자는 그것을 테스트했으며, kill하려고하는 프로세스의 PID를 보유하고 있으며 ps 목록의 프로세스를 보았습니다. –

+0

옵션을 쓰지 않고'ps '를 실행하면 모든 프로세스가 표시되지 않습니다. ps를 콘솔에서 실행하고 프로세스를 볼 수 있습니까? –

+0

예 ps 만 사용하여 볼 수 있습니다. 나는 그것이 busybox 행동의 원인이라고 생각한다. –

관련 문제