我是初始化脚本世界的新手,而且仍然是 BASH 新手。我目前的情况需要一些指导。
我们运行一个利用 JBOSS 的应用程序,我需要能够使用 init 脚本像守护进程一样处理它。这是我第一次编写初始化脚本,我知道“.pid”文件通常用于使用初始化脚本来跟踪进程,但是我想知道在我的情况下是否真的需要它们。
例如,当我使用 init 脚本的“stop”功能时,我可以让它检查 .pid 文件以获取进程 ID,或者我可以简单地使用“checkproc”让它获取 PID。
这是我写的一个例子。
JBOSSPID=$(checkproc -v $JBOSS_PROCESS_NAME)
function _stop {
# Check if JBOSS is running..
if [ -z "$JBOSSPID" ]; then
echo "Service is not running.."
exit
fi
# Attempt to shutdown JBOSS gracefully..
echo "Stopping service.."
./stop_jboss.sh
# Loop until JBOSS PID no longer exists..
RUNNING=0
while [ "$RUNNING" == "0" ]
do
JBOSSPID=$(checkproc -v $JBOSS_PROCESS_NAME)
if [ "$JBOSSPID" == "" ]; then
RUNNING=1
fi
done
}
我也编写了“start”和“status”函数来获取PID。我测试了它,它似乎工作正常,但我不知道是否缺少一些东西,如果没有 .pid 文件,可能会出错。我有什么理由放弃这个逻辑并转而使用 .pid 文件吗?
答案1
您可以在没有 pid 文件的情况下制作 init 脚本,不会有任何问题。除非另一个用户手动启动jboss实例。我认为您的初始化脚本无法处理“checkproc -v $JBOSS_PROCESS_NAME”返回的多行
当可能在同一台计算机上启动多个应用程序时,pid 文件主要有用。您不希望您的初始化脚本停止其他用户启动的实例。
因此,您可以保存从 init 脚本启动的程序的 pid 文件,而不是杀死第一个(或所有)具有特定字符串的程序。这样,当您尝试杀死该程序时,您只会杀死您启动的程序。