gpt4 book ai didi

linux - 存储被另一个脚本调用的脚本的PID

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:51 26 4
gpt4 key购买 nike

我是 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?

最佳答案

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

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

关于linux - 存储被另一个脚本调用的脚本的PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16414824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com