service命令可以快速地开启和停止linux中的服务程序,这在调试过程中非常有用.chkconfig命令可以快速地设置开机时需要自动启动的服务程序.
这两个命令的功能都可以通过其他方法实现,只不过有了它们之后更加方便,维护工作可以更加轻松.
service命令和进程管理脚本
在debian linux中如果用apt-get命令安装mysql,nginx等服务程序,安装程序都会自动在/etc/init.d/目录中创建一个管理此服务进程用的shell脚本,如:
1
2
3
|
/etc/init
.d
/mysql
/etc/init
.d
/nginx
/etc/init
.d
/keepalived
|
这样就用可以用/etc/init.d/{脚本文件名} start 或 service {脚本文件名} start 来启动一个服务,如:
1
2
3
|
#启动mysql服务
/etc/init
.d
/mysql
start
service mysql start
|
1
2
3
|
#重新启动mysql服务
/etc/init
.d
/mysql
restart
service mysql restart
|
上面两个命令的效果是一样的,这样重启mysql或php-fpm的时候就不用每次都先把进程kill掉,然后写一大段路径和参数来启动服务了.只不过用service命令的话只要记住脚本文件名,不用写绝对地址,这样比较方便,默认的脚本文件名都是和服务程序的名字一样的.
如果自己编译安装php-fpm等服务程序,/etc/init.d目录中的这个脚本是需要自己加的.幸运的是很多服务程序的源码包中都附带了这个脚本如:
1
2
3
|
mysql5.6源码中的 support-files
/mysql
.server
php5.4源码中的 sapi
/fpm/init
.d.php-fpm
redis2.6源码中的 utils
/redis_init_script
|
1
|
chmod
+x
/etc/init
.d
/mysql
/etc/init
.d
/nginx
/etc/init
.d
/redis
|
有的时候需要修改脚本中的参数如路径名等才能顺利执行,需要简单调试一下.
这里需要注意一下service命令后面的参数
service命令后面的第一个参数,一定要和/etc/init.d中的脚本名字一样,要不然系统会报错,为了简单,可以直接命名成服务程序名字.
service命令的第二个参数,如start,stop,restart,它是传给进程管理脚本的.所以是否支持这个参数不是service命令决定的,是进程管理脚本决定的,使用不同的进程管理脚本,可以选择的命令参数和功能也是不同的.
进程管理脚本都会支持start和stop两个命令参数,还有可能支持其他的命令参数.一般可以用service {脚本名} 查看脚本的帮助信息,里面有支持的命令参数如:
1
2
3
4
5
6
|
root@lvmingming:
/etc/init
.d
# service mysql
Usage:
/etc/init
.d
/mysql
start|stop|restart|reload|force-reload|status
root@lvmingming:
/etc/init
.d
# service redis
Please use start or stop as first argument
root@lvmingming:
/etc/init
.d
# service memcached
Usage:
/etc/init
.d
/memcached
{start|stop|restart|force-reload|status}
|
如果需要编译安装服务程序,并且源码里没有进程管理脚本,如memcached.那只能上网查别人写好的脚本了.要不然自己写个进程管理脚本也不错~
chkconfig命令和/etc/rc.local脚本
chkconfig命令可以用来配置某一项服务是否开机自动启动,有些版本的linux需要自己手动安装这个命令,如debian linux中安装chkconfig命令:
1
|
apt-get
install
chkconfig
|
chkconfig命令同样要依赖放在/etc/init.d目录中的进程管理脚本.
chkconfig命令示例:
1
2
3
4
5
6
7
|
#以下脚本在debian linux中测试通过
chkconfig --help
#查看chkconfig命令语法
chkconfig -l
#查看所有服务程序在所有运行级别下的是否开机自动启动
chkconfig -l mysql
#查mysql服务在所有运行级别下的是否开机自动启动
chkconfig -a mysql
#在服务列表中添加新的服务mysql并设置成开机自动启动
chkconfig -d mysql
#取消mysql服务的开机自动启动设置
chkconfig -s mysql 2345
#让mysql在2345这几个运行级别下开机自动启动,如果某一运行级别下的链接没有正确添加,可以使用这个命令添加一下.
|
chkconfig的原理
/etc目录下有一组rc开头目录,它们用来存放在各个运行级别下linux自动启动的服务:
1
2
3
4
5
6
7
8
|
/etc/rcS
.d/
#开机后需要自动启动的一些基本服务
/etc/rc0
.d/
#运行模式0下需要启动的服务
/etc/rc1
.d/
#运行模式1下需要启动的服务
/etc/rc2
.d/
#运行模式2下需要启动的服务
/etc/rc3
.d/
#运行模式3下需要启动的服务
/etc/rc4
.d/
#运行模式4下需要启动的服务
/etc/rc5
.d/
#运行模式5下需要启动的服务
/etc/rc6
.d/
#运行模式6下需要启动的服务
|
debian linux的默认运行级别是2,看一下/etc/rc2.d/中的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
root@lvmingming:~
# ls -l /etc/rc2.d/
total 4
-rw-r--r-- 1 root root 677 Nov 17 2012 README
lrwxrwxrwx 1 root root 17 May 30 2011 S01ipvsadm -> ..
/init
.d
/ipvsadm
lrwxrwxrwx 1 root root 17 Feb 6 13:45 S16apache2 -> ..
/init
.d
/apache2
lrwxrwxrwx 1 root root 20 Jun 10 16:31 S17keepalived -> ..
/init
.d
/keepalived
lrwxrwxrwx 1 root root 19 Jun 13 13:54 S17memcached -> ..
/init
.d
/memcached
lrwxrwxrwx 1 root root 15 Feb 6 13:45 S17mysql -> ..
/init
.d
/mysql
lrwxrwxrwx 1 root root 28 Feb 16 13:14 S17nagios-nrpe-server -> ..
/init
.d
/nagios-nrpe-server
lrwxrwxrwx 1 root root 15 Feb 6 13:45 S17nginx -> ..
/init
.d
/nginx
lrwxrwxrwx 1 root root 15 Feb 6 13:45 S17rsync -> ..
/init
.d
/rsync
lrwxrwxrwx 1 root root 16 Feb 6 13:45 S17vsftpd -> ..
/init
.d
/vsftpd
lrwxrwxrwx 1 root root 22 Apr 3 14:06 S18avahi-daemon -> ..
/init
.d
/avahi-daemon
lrwxrwxrwx 1 root root 15 Feb 6 13:45 S18exim4 -> ..
/init
.d
/exim4
lrwxrwxrwx 1 root root 18 Feb 6 13:45 S20rc.
local
-> ..
/init
.d
/rc
.
local
|
每个软链接的命名都是"大写S+运行顺序+脚本名称",里面有一个链接是"S20rc.local -> ../init.d/rc.local".打开它指向的脚本/etc/init.d/rc.local看一下,发现它里面调用了/etc/rc.local这个脚本.原来/etc/rc.local中的命令是在这儿执行的.
如果把mysql服务的启动命令放进/etc/rc.local中,操作系统也会在执行这个列表的时候执行它,不过它的执行顺序是20,比排在前面的S17mysql还要晚一些~
关于系统开机自启动请点击。