0

私はシェル スクリプトのまったくの初心者で、簡単なアプリケーションをいくつか作成して実行しようとしています。アプリケーションを起動することはできますが、呼び出されたスクリプトの 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

start コマンドでこのスクリプトを呼び出すと、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 を 3 として保存しているので、アプリケーションを停止しようとすると失敗します。停止したいアプリケーションには 3 ではなく 7 があるためです

スクリプトのどの部分が予想される PID を台無しにしているのか、誰でも助けてくれますか?

4

2 に答える 2

0

コマンドから実行されるすべてのプログラムは通常、同じプロセス グループに属し、その ID は初期プロセスの PID です。コマンドに負の PID を指定すると、プロセス グループ全体を強制終了できますkill。そう:

kill -INT -3

すべてを殺す必要があります。

最初の引数が で始まる場合-、シグナル番号として解釈されるため、明示的にシグナルを指定する必要があることに注意してください。

于 2013-05-07T08:58:11.703 に答える