2013-05-07 58 views
0

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

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

回答

0

您正在获取sudo的PID,该PID使用另一个PID执行脚本。因此,查询ps为您获得的PID的所有孩子,假设sudo只启动一个进程,您将获得正确的PID。

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

+0

所以我有一个关于pid的问题...我一直在测试并试图找到一种方法来正确地杀死进程..并发现,我想杀死的进程始终是sudo + 2的PID。所以我可以尝试杀死那个pid + 2的值?或者它只是一个随机值,取决于可用的pid? – stephanruhl 2013-05-13 02:02:17

+0

很好的+2的事情......它并不总是发生......所以不是一个很好的方法来解决这个问题......我猜 – stephanruhl 2013-05-13 07:07:11

+0

不,它不是。一个常见的攻击是让grandcild将它的PID写入一个文件(比如说,/var/lib/myapp/child.pid)并将它读回父... – 2013-05-13 09:19:54

0

从命令运行的所有程序通常都在同一个进程组中,其ID是初始进程的PID。通过给kill命令赋予一个负的PID,可以杀死整个进程组。所以:

kill -INT -3 

应该杀死所有的东西。

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

+0

负pid正在返回类似于此的内容:/ bin/kill:-3:没有这样的进程 – stephanruhl 2013-05-13 02:00:44

+0

,如果我给kill -9 ,它只是在杀死根进程,而我想杀的那个仍然在运行 – stephanruhl 2013-05-13 02:35:10

+0

这不太可能,3是实际的PID你想杀人的过程。我只是使用示例'ps'输出中的PID,将其替换为正确的。 – Barmar 2013-05-13 14:29:26

相关问题