以下是/etc/init.d/{httpd,nginx}两个脚本中的reload函数。
## reload() in /etc/rc.d/init.d/httpd reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then # 语法检查 RETVAL=6 echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else # Force LSB behaviour from killproc # 语法检查通过,发送HUP信号 LSB=1 killproc -p ${pidfile} $httpd -HUP RETVAL=$? if [ $RETVAL -eq 7 ]; then # 注意reload失败时退出状态码为7 failure $"httpd shutdown" fi fi echo } ## reload() in /etc/rc.d/init.d/nginx reload() { configtest_q || return 6 # 语法检查 echo -n $"Reloading $prog: " killproc -p $pidfile $prog -HUP # 发送HUP信号 echo } configtest_q() { $nginx -t -q -c $NGINX_CONF_FILE } case "$1" in reload) rh_status_q || exit 7 # reload失败时,退出状态码7 $1 ;;唯一需要注意的是,reload失败时,退出状态码为7。这大概已经约定俗成了吧。
再看/etc/init.d/sshd中的reload。
reload() { echo -n $"Reloading $prog: " killproc -p $PID_FILE $SSHD -HUP RETVAL=$? echo } case "$1" in reload) rh_status_q || exit 7 reload ;;有意思的是mysqld的reload。它直接退出不做任何动作。
case "$1" in reload) exit 3 ;;如果不使用killproc函数,而是使用kill命令,那么应该找出"master" pid。可以使用functions中的pidofproc函数。例如:
pid=$(pidofprco -p pidfile $processname) action "Reloading $prog: " kill -HUP $pid 1.6 status、restart、force-reload等status:就是为了获取进程状态的,一般直接调用functions���的status函数status -p "$pidfile" $prog。
restart:一般直接stop再start即可。
force-reload:其实就是restart。
condrestart:称为条件式重启。所谓的条件一般是判断锁文件是否存在,存在则重启,否则忽略该动作。"try-restart"也是一样的行为。
1.7 结束语其实SysV服务启动脚本大多都很简单,至少它们的逻辑几乎都一样。在了解了functions中的几个函数后,再把脚本的各参数(如start、stop)应该要具备的能力搞搞清楚,这类脚本完全是小菜一两碟。