Centos7将脚本创建成系统服务
在工作中有时会遇到需要在服务器启动的时候自动运行系统脚本以使服务器在断电或异常重启后自动恢复业务系统。本文介绍如何将脚本创建成系统服务。让脚本跟着系统启动。
Centos上配置开机自启动的几种方式
方式一:直接在/etc/rc.d/rc.local中添加服务启动命令
/etc/rc.d/rc.local脚本会在Centos系统启动时被自动执行,所以可以把需要开机后执行的命令直接放在这里。直接将服务的启动命令添加到/etc/rc.d/rc.local中。
vi /etc/rc.d/rc.local
也可以自己编写服务启动的脚本。由于重启时是以root用户重启,需要保证root用户有脚本执行权限。编写服务启动的脚本、赋予脚本可执行权限
chmod +x /opt/script/autostart.sh
打开/etc/rc.d/rc.local文件,在末尾增加如下内容
/opt/script/autostart.sh #你脚本所在全路径
在centos7中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限
chmod +x /etc/rc.d/rc.local
方式二:通过chkconfig配置服务自启动
在CentOS7之前,可以通过chkconfig来配置开机自启动服务。
chkconfig相关命令:
chkconfig –-add xxx //把服务添加到chkconfig列表
chkconfig --del xxx //把服务从chkconfig列表中删除
chkconfig xxx on //开启开机自动启动
chkconfig xxx off //关闭开机自动启动
chkconfig --list //查看所有chklist中服务
chkconfig --list xxx //查看指定服务
**chkconfig运行级别level和启动顺序的概念:
**chkconfig --list

这里的0到6其实指的就是服务的level。
–level<等级代号> 指定系统服务要在哪一个执行等级中开启或关毕。
- 等级0表示:表示关机
- 等级1表示:单用户模式
- 等级2表示:无网络连接的多用户命令行模式
- 等级3表示:有网络连接的多用户命令行模式
- 等级4表示:不可用
- 等级5表示:带图形界面的多用户模式
- 等级6表示:重新启动
//设定mysqld在等级3和5为开机运行服务
chkconfig --level 35 mysqld on
//设置network服务开机自启动,会把2~5的等级都设置为on
chkconfig network on
服务的启动顺序是指在服务器启动后服务启动脚本执行的顺序。

cat /etc/init.d/network
其中 # chkconfig: 2345 10 90用来指定服务在各个level下的启动顺序。
该配置的含义是network服务在2、3、4、5的level下的启动顺序是10,在1和6的level等级下的启动顺序是90。
chkconfig配置的服务启动顺序最后都会在/etc/rc.d/目录下体现出来:
cd /etc/rc.d/

文件中脚本命名规则,首字母K表示关闭脚本,首字母S表示启用脚本,数字表示启动的顺序.
每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。
第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 - 代替运行级。
第二行对服务进行描述,可以用\ 跨行注释。
#!/bin/bash
#chkconfig:2345 98 02
#description:kibana
方式三:Centos7通过systemctl enble配置服务自启动
在Centos7后,更推荐通过systemctl来控制服务。

systemctl服务的目录介绍
服务的管理是通过 systemd,而 systemd 的配置文件大部分放置于 /usr/lib/systemd/目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,建议不要修改!而要修改的位置应该放置于 /etc/systemd/system/目录内。
Centos 系统服务脚本目录:/usr/lib/systemd/
有系统(system)和用户(user)之分,如需要开机没有登录情况下就能运行的程序,存在系统服务(system)里,用户登录后才能运行的程序,存在用户(user)里,服务以.service结尾。即:
/usr/lib/systemd/system/
/usr/lib/systemd/user/
#示例
cd /etc
/systemd/system
/
vim testforzabbix.service
#编辑脚本
[Unit]
Description=testforzabbix
After=network.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/etc
/init.d/testforzabbixstart
ExecReload=/etc/init.d/testforzabbixrestart
ExecStop=/etc/init.d/testforzabbixstop
PrivateTmp=true
[Install]
WantedBy=multi-user.targe
这里ExecStart、ExecReload、ExecStop的命令还是借助了上文在/etc/init.d目录下配置kibana脚本来实现。[Service]的启动、重启、停止命令全部要求使用绝对路径,[Install]服务安装的相关设置,可设置为多用户。
参数说明:
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
User 服务启动用户
Group 服务启动用户组
ExecStart 为服务的具体运行命令
ExecReload 为重启命令
ExecStop 为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
chmod 754 testforzabbix.service
服务的启动、停止、开机启动
查看服务状态
//重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载
systemctl daemon-reload
//查看服务状态
systemctl status testforzabbix.service
####开机启动
systemctl enable testforzabbix.service

###示例1nginx
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
###示例2mysql
[Unit]
Description=mysql
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/mysql/support-files/mysql.server start
#ExecReload=/usr/local/mysql/support-files/mysql.server restart
#ExecStop=/usr/local/mysql/support-files/mysql.server stop
#PrivateTmp=true
[Install]
WantedBy=multi-user.target
###示例3redis
[Unit]
Description=Redis
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecStop=kill -INT `cat /tmp/redis.pid`
User=www
Group=www
[Install]
WantedBy=multi-user.target
浙公网安备 33010602011771号