killproc 如何知道要杀死的 PID?

use*_*702 7 init.d

当我查看 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 语句。

如果您查看crondinit 脚本(该脚本写得很好,并且清楚地了解正在发生的事情),它会显示正确调用 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)