LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 152|回复: 0

pidfileofproc和pidofproc函数

[复制链接]
发表于 2023-12-18 15:29:18 | 显示全部楼层 |阅读模式

pidfileofproc和pidofproc函数
除了以上3个pid相关函数,functions文件中,还提供了两个函数pidfileofproc和pidofproc,均用于获取给定程序的pid值。

以下是pidfileofproc函数的定义语句。注意,该函数不是获取pidfile,而是获取pid值。

# A function to find the pid of a program. Looks *only* at the pidfile
pidfileofproc() {
    local pid

    # Test syntax.
    if [ "$#" = 0 ] ; then
        echo $"Usage: pidfileofproc {program}"
        return 1
    fi

    __pids_var_run "$1"          # 不提供pidfile,因此认为是/var/run/$base.pid
    [ -n "$pid" ] && echo $pid
    return 0
}
因此,pidfileofproc函数只能获取/var/run下的pid。

以下是pidofproc函数的定义语句:

# A function to find the pid of a program.
pidofproc() {
    local RC pid pid_file=

    # Test syntax.
    if [ "$#" = 0 ]; then
        echo $"Usage: pidofproc [-p pidfile] {program}"
        return 1
    fi
    if [ "$1" = "-p" ]; then    # 既可以获取/var/run/$base.pid中的pid,
        pid_file=$2             # 也可以获取自给定pid文件中的pid
        shift 2
    fi

    fail_code=3 # "Program is not running"

    # First try "/var/run/*.pid" files
    __pids_var_run "$1" "$pid_file"
    RC=$?
    if [ -n "$pid" ]; then     # $pid不为空时,输出program的pid值
        echo $pid
        return 0
    fi

    [ -n "$pid_file" ] && return $RC   # $pid为空,但使用了"-p"指定pidfile时,返回$RC。
    __pids_pidof "$1" || return $RC    # $pid为空,且$pidfile为空时,获取进程号pid并输出
}
这两个函数的区别在于pidfileofproc只能搜索/var/run下的pid,而pidofproc可以搜索自给定的pidfile或/var/run/下的pid。而前面的__pids_pidof函数,只有在获取bash进程时更精确(因为它会忽略父shell进程)。至于3个选哪个的问题,见文末总结。

这两个函数用的比较少,但确实有使用它的脚本。如crond启动脚本中借助pidfileofproc来杀进程:

echo -n $"Stopping $prog: "
if [ -n "`pidfileofproc $exec`" ]; then
        killproc $exec
        RETVAL=3
else
        failure $"Stopping $prog"
fi
dnsbind的named服务启动脚本中借助pidofproc来判断进程是否已在运行。

pidofnamed() {
        pidofproc -p "$ROOTDIR$PIDFILE" "$named";
}

if [ -n "`pidofnamed`" ]; then
  echo -n $"named: already running"
  success
  echo
  exit 0;
fi;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表