我是一个使用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?
所以我有一个关于pid的问题...我一直在测试并试图找到一种方法来正确地杀死进程..并发现,我想杀死的进程始终是sudo + 2的PID。所以我可以尝试杀死那个pid + 2的值?或者它只是一个随机值,取决于可用的pid? – stephanruhl 2013-05-13 02:02:17
很好的+2的事情......它并不总是发生......所以不是一个很好的方法来解决这个问题......我猜 – stephanruhl 2013-05-13 07:07:11
不,它不是。一个常见的攻击是让grandcild将它的PID写入一个文件(比如说,/var/lib/myapp/child.pid)并将它读回父... – 2013-05-13 09:19:54