functions文件详细分析和说明(5)

以下是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进程)。至于选哪一个,见文末总结

这两个函数用的比较少,但确实有使用它的脚本。如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; 6.重头戏(一):daemon函数

daemon函数用于启动一个程序,并根据结果输出success或failure。

定义语句如下:

# A function to start a program. daemon() { # Test syntax. local gotbase= force= nicelevel corelimit # 定义一大堆变量 local pid base= user= nice= bg= pid_file= local cgroup= nicelevel=0 while [ "$1" != "${1##[-+]}" ]; do # 当参数$1以"-"或"+"开头时进入循环,但$1为空时也满足 case $1 in '') echo $"$0: Usage: daemon [+/-nicelevel] {program}" "[arg1]..." return 1;; --check) # daemon接受"--arg value"和"--arg=value"两种格式的参数 base=$2 gotbase="yes" shift 2 ;; --check=?*) base=${1#--check=} gotbase="yes" shift ;; --user) user=$2 shift 2 ;; --user=?*) user=${1#--user=} shift ;; --pidfile) pid_file=$2 shift 2 ;; --pidfile=?*) pid_file=${1#--pidfile=} shift ;; --force) force="force" shift ;; [-+][0-9]*) nice="nice -n $1" shift ;; *) echo $"$0: Usage: daemon [+/-nicelevel] {program}" "[arg1]..." return 1;; esac done # Save basename. [ -z "$gotbase" ] && base=${1##*/} # 若未传递"--check",则此处获取bashname # See if it's already running. Look *only* at the pid file. __pids_var_run "$base" "$pid_file" [ -n "$pid" -a -z "$force" ] && return # 如进程已在运行(已检测出pid),且没有使用force # 强制启动,则退出daemon函数 # make sure it doesn't core dump anywhere unless requested corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}" # corelimit、cgroup和资源控制有关,忽略它 # if they set NICELEVEL in /etc/sysconfig/foo, honor it [ -n "${NICELEVEL:-}" ] && nice="nice -n $NICELEVEL" # if they set CGROUP_DAEMON in /etc/sysconfig/foo, honor it if [ -n "${CGROUP_DAEMON}" ]; then if [ ! -x /bin/cgexec ]; then echo -n "Cgroups not installed"; warning echo else cgroup="/bin/cgexec"; for i in $CGROUP_DAEMON; do cgroup="$cgroup -g $i"; done fi fi # Echo daemon [ "${BOOTUP:-}" = "verbose" -a -z "${LSB:-}" ] && echo -n " $base" # And start it up. # 启动程序。runuser的"-s"指定执行程序的shell,$user指定运行的身份 # "$*"是剔除掉daemon选项后程序的启动指令。 if [ -z "$user" ]; then $cgroup $nice /bin/bash -c "$corelimit >/dev/null 2>&1 ; $*" else $cgroup $nice runuser -s /bin/bash $user -c "$corelimit >/dev/null 2>&1 ; $*" fi [ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup" }

daemon函数调用方法:

daemon [--check=servicename] [--user=USER] [--pidfile=PIDFILE] [--force] program [prog_args]

需要注意的是:

只有"--user"可以用来控制program启动的环境。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13446.html