所以,要使用这3个函数中的哪一个?如果要找出进程的"master"进程号,例如要向主进程发送HUP信号reload配置文件时,应该用pidofproc并使用"-p"指定pid文件。其余时候用__pids_pidof准没错,也正是如此,在daemon和killproc函数中都使用了它。另外,在多实例的情况下,也可以考虑使用pidofproc来根据pidfile搜索对应实例的pid。
9.2 daemon的使用daemon:启动一个服务程序。在启动前还检查是否已在运行。
调用方式:
daemon [--check=servicename] [--user=USER] [--pidfile=PIDFILE] [--force] program [prog_args]"--user"用于指定进程运行身份,"--check"和"--pidfile"用于指定检查进程是否已在运行,"--force"表示即使在运行也同样再启动一个程序。prog_args用于为program程序提供启动参数。
一般daemon会配合以下几个语句同时执行,这正是SysV脚本的一个特点。
echo -n $"Starting $prog: " daemon --pidfile=${pidfile} $prog $OPTIONS RETVAL=$? [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL注意,daemon函数启动程序时,自身就会调用success或failure函数,所以就不需再使用action函数了。如果不使用daemon函数启动服务,通常会配合action函数。例如:
$prog $OPTIONS RETVAL=$? [ $RETVAL -eq 0 ] && action "Starting $prog" /bin/true && touch ${lockfile} 9.3 killproc的使用killproc:杀掉给定的服务进程。
函数调用方式:
killproc [-p pidfile] [-d delay] program [-signal]"-p pidfile":选项用于指定从此文件中获取进程的pid号,不指定时默认从/var/run/$base.pid中获取。
"-signal":用于指定kill发送的信号。如果不指定,则默认先发送TERM信号,在"-d delay"时间段内仍不断检测是否进程已经被杀死,如果还未死透,则delay超时后发送KILL信号强制杀死。
"-d delay":指定未使用"-signal"时的延迟检测时间。有效单位为秒、分、时、日("smhd"),不写时默认为秒。
需要明确的是,只有/proc目录下没有了pid对应的目录才算是杀死了。
一般来说,killproc前会判断进程是否已在运行,最后还要删除pid文件和lock文件。当然,killproc函数可以保证pid文件被删除。所以,killproc函数大致会同时配合以下语句用来杀进程:
status -p ${pidfile} $prog > /dev/null if [[ $? = 0 ]]; then echo -n $"Stopping $prog: " killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd else echo -n $"Stopping $prog: " success fi RETVAL=$? [ $RETVAL -eq 0 ] && rm -f ${lockfile} ${pidfile}同样注意,killproc中已经自带success和failure函数。如果不使用killproc杀进程,则通常会配合action函数或者success、failure。大致如下:
killall $prog ; usleep 50000 ; killall $prog RETVAL=$? if [ "RETVAL" -ne 0 ];then action $"Stopping $prog: " /bin/true rm -rf ${lockfile} ${pidfile} else action $"Stoping $prog: " /bin/false fi以上由于采用的是killall命令,如果采用的是kill命令,则需要先获取进程的pid,在此之前还要检查pid文件是否存在。
9.4 status的使用status:检查给定进程的运行状态。
用于返回进程状态。调用方式:注意"-p"必须在"-l"前面
status [-p pidfile] [-l lockfile] program共有 以下几种状态:
${base} (pid $pid) is running...
${base} dead but pid file exists
${base} status unknown due to insufficient privileges.
${base} dead but subsys locked
${base} is stopped
10.memcached服务启动脚本示例以下是memcached服务启动脚本的示例,是一个非常简单但却非常通用的Sysv服务启动脚本。
#!/bin/bash # # chkconfig: - 86 14 # description: Distributed memory caching daemon ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS="" RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached" . /etc/rc.d/init.d/functions [ -f /etc/sysconfig/memcached ] && source /etc/sysconfig/memcached start() { echo -n $"Starting $desc (memcached): " daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE "$OPTIONS" RETVAL=$? echo [ $RETVAL -eq 0 ] && touch $lockfile return $RETVAL } stop() { echo -n $"Shutting down $desc (memcached): " killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f $lockfile return $RETVAL } restart() { stop start } reload() { echo -n $"Reloading $desc ($prog): " killproc $prog -HUP RETVAL=$? echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e $lockfile ] && restart RETVAL=$? ;; reload) reload ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}" RETVAL=1 esac exit $RETVAL另请参考:如何写SysV服务管理脚本。