SysV脚本与chkconfig
Rh系的发行版本多使用SysV脚本,在系统中多用chkconfig来管理,能被chkconfig管理的启动脚本必须至少有两行注释性语句,分别为chkconfig/description
# chkconfig: 表示指定脚本运行在哪些运行级别下、启动各结束的优先级,如果脚本不在任何级别运行,可用'-'表示
# description: 描述信息,多行可用'\'延续
示例:
#chkconfig: 2345 80 20
#description: This is a test in line 1 \
# Line 2
以上表示如果在服务脚本在使用chkconfig --add 添加时,会在rc{2|3|4|5}.d下生成相应的符号链接,优先级为80,名字类似于S80sname
在rc.0/rc.6下会生成相应的结束符号链接,名字类似于K20sname,sname为服务名
SysVInit脚本编写
必须有两种入口方法,一是start,二是stop,建议将这两个东西做成函数,另外SysVInit软件包也提供了一个常用的文件/etc/rc.d/init.d/functions
可以在自己的文件中引入它,从而大大简化了书写过程,还可以美化输出信息,如支持字体色彩等。
/etc/rc.d/init.d/functions中常用的几个函数
daemon 可直接接程序名,还可以跟其它参数如--pidfile 指定pid文件
killproc 可直接接程序名,也可以跟其它参数-p 接pid文件
status 可直接接程序名,也可以跟其它参数-p 接pid文件
如果程序有以daemon运行的选项,可以使用success或者failure来输出成功或失败信息,没有的话直接用functions中的daemon来运行。
K开头脚本还有一个值得注意的,runlevel在执行K脚本时会检查/var/lock/subsys/目录下有没有同名[服务名]的文件,如果有就执行这个脚本,如果没有就跳过
另外,如果仔细研究init.d下的脚本,会发现一些双引号包裹的字符串前有一个美元符号 ($"...") ,这将会使得字符串被翻译成符合当前locale的语言。如果当前locale是 C 或者 POSIX,美元符号会被忽略。如果字符串被翻译并替换,替换后的字符串仍被双引号包裹[还不知道具体怎么翻译的,这个是在维基上找到的]。
附上一个openvpn的[openvpn有自己的daemon选项,所有没有使用functions中的daemon]:
#!/bin/bash
#
# openvpn Startup script for openvpn server
# chkconfig: 345 98 10
# description: OpenVPN Server For GFWprog="openvpn"
prog_dir="/etc/openvpn"
prog_cfg="server.conf"
lock_file="/var/lock/subsys/${prog}"
RETVAL=0. /etc/rc.d/init.d/functions
start(){
echo -n $"Starting $prog: "
/usr/local/sbin/${prog} --cd ${prog_dir} --config ${prog_dir}/${prog_cfg} --daemon
RETVAL=$?
[ "${RETVAL}" -eq 0 ] && success || failure
echo
[ "${RETVAL}" -eq 0 ] && touch ${lock_file}
return ${RETVAL}
}
stop(){
echo -n $"Stopping $prog: "
killproc -d 5 ${prog}
RETVAL=$?
[ "${RETVAL}" = "0" ] && rm -f ${lock_file}
echo
#[ "${RETVAL}" -eq 0 ] && success || failure
}case "$1" in
start)
start
;;
stop)stop
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo "Usage $prog {start|stop|restart|status}"
exit 1
esac
