2013-05-07 5 views
0

저는 쉘 스크립팅을하는 완전 초보자이며, 약간의 쓰기를 시도하고 간단한 응용 프로그램을 실행 시키려고합니다. 응용 프로그램을 시작할 수는 있지만 호출 된 스크립트의 PID를 저장해야 할 때 스크립트 자체의 PID를 저장하므로 중지하거나 다시 시작할 수 없습니다. 여기가 PID 얻기를 위해 실행하고 내 스크립트입니다다른 스크립트에서 호출중인 스크립트의 PID를 저장합니다.

#!/bin/sh 
JAVA_BIN=/usr/local/jdk7/jre/bin/java 
test -x $JAVA_BIN || { echo "$JAVA_BIN not installed"; 
    if [ "$1" = "stop" ]; then exit 0; 
    else exit 5; fi; } 

# Check for existence of needed script file 
NEW_SCRIPT=/usr/local/me/myscript.sh 
test -r $NEW_SCRIPT|| { echo "$NEW_SCRIPT does not exist"; 
    if [ "$1" = "stop" ]; then exit 0; 
    else exit 6; fi; } 
PID_FILE=/var/run/newd.pid 
USER=newuser 
HOME_DIR=/usr/local/me 
LOG_FILE=/var/log/newd.log 
HOST_NAME=some.hostname.com 


case "$1" in 
    start) 
     echo "Starting newd..." 

     cd ${HOME_DIR} || (\ 
      echo "can't cd to homedir"; exit 1 
     ) 

     sudo -u ${USER} ${NEW_SCRIPT} >> ${LOG_FILE} 2>&1 & 

     echo "PID: " 
     echo $! 
     echo "\n" 


     echo $! > ${PID_FILE} || (
      echo "error storing pid to ${PID_FILE}"; exit 1 
     ) 
    ;; 
stop) 
    echo "Shutting down newd..." 
    /bin/kill `cat ${PID_FILE}` 
    ;; 
restart) 
    $0 stop 
    sleep 5 
    $0 start 
    ;; 
status) 
    echo "Checking for service newd..." 
    statc=$(curl -I http://${HOST_NAME}:8080/test/url | head -n1 | grep HTTP | awk '{print $2}') 

    if [ "$statc" != "200" ]; then 
      echo "down" 
      exit 1 
    fi 

    echo "OK" 
    #ps u -p `cat ${PID}` 
    exit 0 
    ;; 
*) 
    echo "Usage: $0 {start|stop|status|restart}" 
    exit 1 
    ;; 
esac 
rc_exit 

시작 명령이 스크립트를 호출 한 후에는 PID를 보여주고,이 경우 3을 말할 수와 PS의 출력은 다음과 같습니다

root  3 sudo -u me /usr/local/me/myscript.sh 
me  6 /bin/sh /usr/local/me/myscript.sh 
me  7 PID which I want 
나는 PID로 삼을 저장하고 같은

, 그때 나는 정지 7을 가지고 싶어 응용 프로그램이 아닌 3

는 누구나 망치고 내 스크립트의 어떤 부분이 나를 도울 수 있기 때문에, 그것은 실패, 응용 프로그램을 중지하려고 예상 된 PID?

답변

0

다른 PID로 스크립트를 실행중인 sudo의 PID를 얻고 있습니다. 따라서 얻을 수있는 PID의 모든 하위 항목에 대해 ps을 쿼리하고 sudo은 하나의 프로세스 만 시작한다고 가정하면 올바른 PID를 얻을 수 있습니다.

게다가 시작된 스크립트를 사용하여 PID_FILE에 자체 PID를 저장하십시오.

+0

그래서 나는 pid에 관한 질문을했습니다. 나는 테스트를 통해 제대로 프로세스를 죽일 수있는 방법을 찾으려고 노력했습니다. 내가 죽이고 싶은 프로세스는 항상 sudo +2의 PID입니다. 그래서 그 pid + 2 값을 죽이려고 할 수 있습니까? 또는 사용 가능한 pids에 따라 임의의 값입니까? – stephanruhl

+0

+2 일을 잘 처리 할 수 ​​있습니다. 항상 발생하는 것은 아니므로 해결 방법이 아닙니다. 내 생각 엔 – stephanruhl

+0

아니요. 일반적인 해킹은 파일 (예 : /var/lib/myapp/child.pid)에 PID를 쓰고 아버지에게 다시 읽도록 할 수있는 손자를 가지고 있습니다 ... –

0

명령에서 실행되는 모든 프로그램은 일반적으로 ID가 초기 프로세스의 PID 인 동일한 프로세스 그룹에 있습니다. kill 명령에 음의 PID를 지정하여 전체 프로세스 그룹을 종료 할 수 있습니다. 따라서 :

kill -INT -3 

은 모든 것을 죽여야합니다.

첫 번째 인수가 -으로 시작될 때 신호 번호로 해석되므로 신호를 명시 적으로 지정해야합니다.

+0

음수 pid가 다음과 유사한 내용을 반환합니다. bin/kill : -3 : 그런 프로세스가 없다면 – stephanruhl

+0

그리고 kill -9를 주었을 경우 , 죽이고 싶은 프로세스가 계속 실행되는 동안 루트 프로세스 만 죽게됩니다. – stephanruhl

+0

3이 실제 프로세스의 PID가 아닌 것 같습니다. 당신이 죽이고 싶은 과정. 난 그냥 예제 ps 출력에서 ​​PID를 사용하여 올바른 것으로 교체하십시오. – Barmar