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;
|