0

我是一个使用 shell 脚本的新手,一直在尝试编写一些脚本并让我的简单应用程序运行。虽然我可以启动应用程序,但我无法停止或重新启动它,因为它存储了脚本本身的 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,然后我尝试停止应用程序,但它失败了,因为我想停止的应用程序有 7,而不是 3

任何人都可以帮助我脚本的哪一部分破坏了预期的 PID?

4

2 回答 2

0

您正在获取 的 PID sudo,它正在使用另一个 PID 执行脚本。所以查询ps你得到的 PID 的所有子进程,假设sudo只启动一个进程,你会得到正确的 PID。

此外,让启动的脚本将自己的 PID 存储在PID_FILE.

于 2013-05-07T08:48:36.747 回答
0

从该命令运行的所有程序通常都在同一个进程组中,其 ID 是初始进程的 PID。您可以通过为命令提供负 PID 来终止整个进程组kill。所以:

kill -INT -3

应该杀死一切。

请注意,您必须明确指定信号,因为当第一个参数以它开头时,-它会被解释为信号编号。

于 2013-05-07T08:58:11.703 回答