当我查看 my 时/etc/rc.d/init.d/functions
,我在我的killproc()
函数下看到以下内容。
if [ -n "${LSB:-}" -a -n "$killlevel" ]; then
RC=7 # Program is not running
else
failure $"$base shutdown"
RC=0
fi
Run Code Online (Sandbox Code Playgroud)
问题是我必须设置我的/etc/init.d/<prog>
脚本来调用以下内容。
killproc -p /jail/var/run/prog.pid
Run Code Online (Sandbox Code Playgroud)
而不是以下。
killproc prog
Run Code Online (Sandbox Code Playgroud)
当我跟踪该killproc()
函数时,只要我不提供该-p <PID file>
选项,它就会将我带到上面的 if 语句。有人可以让我知道 if 语句的作用,因为我不知道 LSB 是做什么用的。
小智 7
killproc
需要杀死程序的完整文件路径,而不仅仅是程序名称。它执行某种字典查找并将完整的程序路径匹配到要杀死的 PID。
LSB 代表Linux 标准基础。它旨在帮助最大限度地提高不同发行版之间的互操作性。然而,CentOS 在某些地方忽略了 LSB,尤其是这里(根据标准,/etc/init.d/functions
应该位于 /lib 中,并且应该提供一个start-daemon
功能,等等)。
查看killproc
源代码,似乎如果没有指定 pid 文件,则killproc
搜索 init.d 中的函数,寻找与指定程序名称的匹配项。如果它没有找到它,它就会落入您追踪到的 if 语句。
如果您查看crond
init 脚本(该脚本写得很好,并且清楚地了解正在发生的事情),它会显示正确调用 killproc
#note the full path to script
exec=/usr/sbin/crond
stop() {
if [ $UID -ne 0 ] ; then
echo "User has insufficient privilege."
exit 4
fi
echo -n $"Stopping $prog: "
if [ -n "`pidfileofproc $exec`" ]; then
killproc $exec
RETVAL=3
else
failure $"Stopping $prog"
fi
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21497 次 |
最近记录: |