2014-09-02 3 views
0

에서와 부팅시에 시작되는 프로세스를 종료캔트 내가 (에서는 /etc/init.d/boot.local) 부팅시 시작 fooinit.rt 프로세스를 데몬

다음

boot.local 파일

... 
/bin/fooinit.rt & 
... 
입니다

나는 fooinit.rt를 죽이기 위해 job에서 주문 목록을 만든다. 그는 C 코드

에 트리거와 나는 fooinit.rt 이것들을 pidof -9 타이머가 만료되면 직장에서

#!/bin/sh 
proc_file="/tmp/gdg_list$$" 
ps -ef | grep $USER > $proc_file 
echo "Stop script is invoked!!" 
suff=".rt" 
pid=`fgrep "$suff" $proc_file | awk '{print $2}'` 
echo "pid is '$pid'" 
rm $proc_file 

'이 죽일 스크립트를 중지 여기 를 기록 죽일 (에서) 정지 스크립트를 작성한다 -9 pid '(of fooinit.rt) 명령은 fooinit.rt 프로세스를 종료 할 수 없습니다 !!

인쇄 된 pid 번호와 "Stop script is inviled !!"문장을 확인했습니다. Ok입니다! 여기

는 C 코드에서 작업 명령 "에서"입니다 반면에

... 
case 708: /* There is a trigger signal here*/ 
{ 
    result = APP_RES_PRG_OK; 
    system("echo '/sbin/stop' | at now + 1 min"); 

} 
... 

, 그것은 수동으로 fooinit.rt을 시작하는 경우 제대로 작동 (나중에 1 분 후에 정지 scriptis가 호출되는 것을 확인) 쉘에서 일반적인 명령으로. (/etc/init.d/boot.local이 아님). 그래서 죽일 -9 일과 종료 fooinit.rt 과정

당신은 어떤 생각이 왜 죽일 -9 foo.rt 프로세스를 종료 할 수가에서는 /etc/init.d/boot.local

답변

0

에서 실행되는 경우 귀하의 솔루션은 경쟁 조건을 중심으로 구축되었습니다. 올바른 프로세스를 죽일 것이라는 보장은 없습니다 (ps 호출과 pid를 사용하려는 시도 사이에 알 수없는 시간이 지나갈 수 있습니다). 또한 tmp 익스플로잇에 취약합니다. 누군가가 수천 개의 심볼릭 링크를 만들 수 있습니다./tmp는/etc/shadow를 가리키는 "gdg_list [1-32767]"이며, root로 실행되면/etc/shadow를 덮어 쓰게됩니다.

또 다른 잠재적 인 문제는 $USER입니다. 올바른지 확인 했습니까? at 작업은 C 프로그램이 실행되는 사용자로 호출되며 fooinit.rt가 실행되는 사용자와 다를 수 있습니다.

또한 스크립트에는 kill 명령이 전혀 포함되어 있지 않습니다.

더 깨끗한 방법은 fooinit.rt를 runit과 같은 프로세스 감독자에서 실행하고 더 이상 필요하지 않을 때 runit을 사용하여 종료하는 것입니다. 그것은/tmp 공격 벡터뿐만 아니라 pid 빙고를 피할 수 있습니다.

pkill -u username -f fooinit.rt을 사용해도 제공된 스크립트보다 덜 복잡 할 수 있습니다.

+0

나는 prob를 풀었습니다. "또 다른 잠재적 인 문제는 $ USER의 설정입니다. 올바른지 확인 했습니까?" 그것은 빙고 !! !! 고마워. – roll

+0

ps -ef에 작업을 배포 할 때 내 c 코드 프로세스 (in)가 root 사용자로 나타나지만 stop 스크립트 (echo "User is '$ USER'">> $ proc_file)에이 파일을 추가 할 때 아무 것도 인쇄하지 않습니다. 다음은 결과입니다. -> User is '' – roll

+0

프로세스를 시작하는 경우 fooinit.rt, invoke.rt (작업이 배포 된 위치)에서 수동으로 쉘에서 출력이 -> User는 'root'입니다. 그리고 정지 스크립트가 제대로 작동합니다! – roll