Centos开机自启的几种方式
阅读数:142 评论数:0
跳转到新版页面分类
Linux
正文
预备知识:
0、在CentOS中,不建议再使用rc.local了,因此需要其它方法设置开机自启服务或脚本。
1、运行级别
Init进程是系统启动后运行的第一个用户进程,它会读取/etc/目录下的inittab文件中initdefault值,这个值称为运行级别,不同的运行级定义如下:
0 | 停机,不要把initdefault设置为0 ,否则无法开机 |
1 | 单用户模式 |
2 | 多用户,没NFS |
3 | 完全多用户模式(标准运行级) |
4 | 系统保留 |
5 | x11(x window) |
6 | 重启 |
2、/etc/rc.d/与/etc/rc.d/init.d的关系
/etc/rc.d/init.d这个目录下的脚本类似于windows中的注册表,在系统启动时候执行。rc.d目录都有子目录rc0.d、rc1.d……rc6.d,每个目录都是到init.d目录的一部分脚本链接,每个运行级别要执行的服务都在相对应目录下,比如级别5要启动的服务就放在rc5.d目录下,但放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件。
这些链接文件前面带K的表示停止一个服务,带S表示开启的意思,后面带的数字用来决定脚本执行的顺序,数值小的先执行,数值大的后执行。
方式一Init.d服务
service httpd start其实是启动了存放在/etc/init.d目录下的脚本。
但Centos7继承了RHEL7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变,也大幅提高了系统服务的运行效率。
Centos7的服务systemctl脚本存放在/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行程序就存在系统服务里,即/usr/lib/systemd/system目录下,每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]。
cd /etc/rc.d/init.d
vi nginx
#!/bin/sh
#
#chkconfig: 2345 80 90
#description: nginx
start() {
/usr/local/nginx/sbin/nginx
}
reload() {
/usr/local/nginx/sbin/nginx -s reload
}
stop() {
/usr/local/nginx/sbin/nginx -s quit
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
exit 1
esac
chmod +x nginx
service nginx start
service nginx stop
service nginx restart
service nginx reload
chkconfig --add nginx
chkconfig --list
方式二: systemctl服务
Centos7中采用了systemd控制系统服务,每一个Unit(服务)都有一个配置文件,告诉Systemd怎么启动这个Unit。Systemd默认从目录/etc/systemd/system/读取配置文件,但是里面存放在大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在此目录里。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。
$ sudo systemctl enable clamd@scan.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
cd /usr/lib/systemd/system/
vi nginx.service
[Unit]
Description=nginx
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/nginx/sbin/nginx
Restart=always
RestartSec=1min
[Install]
WantedBy=multi-user.target
chmod +x nginx.service,最后重启下systemctl:systemctl daemon-reload
systemctl enable nginx.service
systemctl start nginx.service
systemctl stop nginx.service
service nginx start
service nginx stop
[Unit]部分 | |
设置参数 | 参数意义说明 |
Description | 就是当我们使用systemctl list-units时,会输出给管理员看的简易说明!当然使用systemctl status也会输出此服务的说明。 |
Documentation |
提供项目在提供管理员能够进一步的文件查询功能。Documentation=http://www.xx.xx Documentation=man:sshd(8) Documentation=file:/etc/ssh/sshd_config |
After | 说明此unit是在哪个daemon启动之后才启动的,但并没有强制要求一定要daemon启动后才启动此unit。 |
Before | 与After相反,不过也仅是规范服务启动的顺序,并非强制要求。 |
Requires | 明确的定义此unit需要在哪个daemon启动后才能够启动,如果在此项设置的前导服务没有启动,那么此unit就不会被启动。 |
Wants | 与Requires相反,规范是这个unit之后最后还要启动什么服务比较好,主要的目的是希望创建让使用者比较好操作的环境,因此,这个Wants后面接的服务如果没有启动,其实不会影响到这个unit本身。 |
Conflicts | 用于冲突性检查,如果后面接的服务启动的,这个unit就不能启动,如果这个unit启动了,则此项目后的服务就不能启动。 |
[Service]部分 | |
设置参数 | 参数说明 |
Type |
说明这个daemon启动的方式,一般有下面几种类型: (1)simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中。 (2)forking:由ExecStart启动的程序fork出子进程来作为此daemon的主要服务,原生的父进程在启动结束后会终止运行。 (3)oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻内存中。 (4)idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行,这类的daemon通常是开机到最后才执行即可的服务。 |
EnvironmentFile |
可以指定启动脚本的环境配置文件,例如sshd.service的配置文件写入到/etc/sysconfig/sshd当中,你也可以使用Environment=后面接多个不同的Shell变量来给予设置。 |
ExecStart |
就是实际执行此daemon的指令或脚本程序,你也可以使用ExecStartPre或ExecStartPost在实际服务前后执行额外的指令,但是需要注意的是,指令串仅接受“指令 参数 参数……”,要傅特殊字符时,最好直接写入指令脚本里面,或使用Type=oneshot。 |
ExecStop |
systemctl stop时执行的指令 |
ExecReload |
systemctl reload时执行的指令 |
Restart |
当设置Restart=1时,则当此daemon服务终止后,会再次的启动此服务。例如如果你在tty2使用文字界面登陆,操作完毕后登出,基本上这个时候tty2就已经结束服务了,但是你会看到屏幕上又产生一个新的tty2的登陆界面,那就是Restart功能,除非使用systemctl强制关闭此服务,否则这个服务会源源不绝的一直重复产生。 |
RemainAfterExit |
当设置为RemainAfterExit=1时,则当这个daemon所属的所有程序都终止之后,此服务会再尝试启动,这对Type=oneshot的服务很有帮助。 |
TimeoutSec |
若这个服务在启动或者关闭时,因此某些缘故无法进行进行,则我们要等多久才进入“强制结束”的状态。 |
KillMode |
(1)process,只会终止主要的程序(ExecStart接的后面那串指令) (2)control-group,则由此daemon所产生的其他的control-group的程序,也会被关闭。 (3)none,没有程序会被关闭 |
RestartSec |
如果这个服务被关闭,然后需要重新启动时,大概要sleep多少时间再重新启动的,默认100ms |
User |
使用指定用户运行 |
Group |
使用指定组运行 |
[Install]部分 | |
设置参数 | 参数意义说明 |
WantedBy | 这个设置后面接的大部分是*.target unit,即这个unit本身是附挂在哪一个target unit下面,一般来说,大多的服务性质的unit都是附挂在multi-user.target下面 |
Also | 当目前这个unit本身被enable时,Also后面接的unit也需要enable |
Alias | 当systemctl enable相关的服务时,则此服务会进行链接文件的创建,例如当你设置用default.target时,这个/etc/systemd/system/default.target就会链接到/usr/lib/systemd/system/multi-user.target。 |
补充说明
Type的类型:
simple(默认): #以ExecStart字段启动的进程为主进程
forking: #ExecStart字段以fork()方式启动,此时父进程将退出,子进程将成为主进程(后台 运行)。一般都设置为forking
oneshot: #类似于simple,但只执行一次,systemd会等它执行完,才启动其他服务
dbus: #类似于simple, 但会等待D-Bus信号后启动
notify: #类似于simple, 启动结束后会发出通知信号,然后systemd再启动其他服务
idle: #类似于simple,但是要等到其他任务都执行完,才会启动该服务。
EnvironmentFile:
指定配置文件,和连词号组合使用,可以避免配置文件不存在的异常。
Environment:
后面接多个不同的shell变量。
例如:
Environment=DATA_DIR=/data/elk
Environment=LOG_DIR=/var/log/elasticsearch
Environment=PID_DIR=/var/run/elasticsearch
EnvironmentFile=-/etc/sysconfig/elasticsearch
连词号(-):
在所有启动设置之前,添加的变量字段,都可以加上连词号,表示抑制错误,即发生错误时,不影响其他命 令的执行。
比如EnviromentFile=-/etc/sysconfig/xxx表示即使文件不存在,也不会抛异常
KillMode的类型:
control-group(默认): #当前控制组里的所有子进程,都会被杀掉
process: #只杀主进程
mixed: #主进程将收到SIGTERM信号,子进程收到SIGKILL信号
none: #没有进程会被杀掉,只是执行服务的stop命令
Restart的类型:
no(默认值): #退出后无操作
on-success: #只有正常退出时(退出状态码为0),才会重启
on-failure: # 非正常退出时,重启,包括被信号终止和超时等
on-abnormal: # 只有被信号终止或超时,才会重启
on-abort: # 只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog: # 超时退出时,才会重启
always: # 不管什么退出原因,都会重启
#对于守护进程,推荐用on-failure
RestartSec字段:
表示systemd重启服务之前,需要等待的秒数:RestartSec:30
Exec*字段:
#Exec*后面接的命令,仅接受“指令参数参数..”格式,不能接受 <> | & 等特殊字符,很多bash语法也不支持。如果想支持bash语法,需要设置Tyep=oneshot
ExecStart: #启动服务时执行的命令
ExecReload: #重启服务时执行的命令
ExecStop: #停止服务时执行的命令
ExecStartPre: #启动服务前执行的命令
ExecStartPost: #启动服务后执行的命令
ExecStopPost: #停止服务后执行的命令
WantedBy字段:
multi-user.target: #表示多用户命令行状态,这个设置很重要
graphical.target: #表示图形用户状体,它依赖于multi-user.target