2023年11月27日发(作者:)

CentOS7开机⾃启服务、脚本

说明:在CentOS7中,不建议再使⽤了,因此需要其它⽅法设置开机⾃启服务或脚本。

1.

添加开机⾃启服务

CentOS7中添加开机⾃启服务⾮常⽅便,只需要两条命令,这⾥以Jenkins为例:

systemctl enable e #设置jenkins服务为⾃启动服务

sysstemctl start e #启动jenkins服务

systemctl其它命令:

systemctl daemon-reload #重载系统服务

systemctl enable *.service #设置某服务开机启动

systemctl start *.service #启动某服务

systemctl stop *.service #停⽌某服务

systemctl reload *.service #重启某服务

2.

添加开机⾃启脚本

1、以脚本为例,先编写脚本

2、将脚本移动到/etc/rc.d/init.d⽬录下

mv /etc/rc.d/init.d

3、赋予脚本执⾏权限

chmod +x /etc/rc.d/init.d/

4、加⼊开机启动

cd /etc/rc.d/init.d

chkconfig --add

chkconfig on

5、查看是否添加成功

chkconfig --list

6、重启验证

7、可能的问题

1) bash: service: command not found

执⾏yum install initscripts -y安装service指令

2) service XXX does not support chkconfig

必须把下⾯两⾏注释放在/etc/init.d/⽂件中

vim /etc/init.d/

添加下⾯两句到#!/bin/bash之后:

#chkconfig: 2345 10 90

#description: autostart

其中2345是默认启动级别,级别有0-67个级别。

²等级0表⽰:表⽰关机

²等级1表⽰:单⽤户模式

²等级2表⽰:⽆⽹络连接的多⽤户命令⾏模式

²等级3表⽰:有⽹络连接的多⽤户命令⾏模式

²等级4表⽰:不可⽤

10是启动优先级,90是停⽌优先级,优先级范围是0~100,数字越⼤,优先级越低。

上⾯的注释的意思是,zookeeper服务必须在运⾏级2345下被启动或关闭,启动的优先级是10,关闭的优先级是90

3.

⾃定义systemctl服务脚本

Centos7开机第⼀程序从init完全换成了systemd的启动⽅式,⽽systemd依靠unit的⽅式来控制开机服务,开机级别等功能。

Centos7的服务systemctl 脚本⼀般存放在:/usr/lib/systemd,⽬录下⼜有usersystem之分:

²/usr/lib/systemd/system #系统服务,开机不需要登录就能运⾏的程序(相当于开机⾃启)

²/usr/lib/systemd/user #⽤户服务,需要登录后才能运⾏的程序

⽬录下⼜存在两种类型的⽂件:

²*.service #服务级别unit

²*.target #开机级别unit

CentOS7的每⼀个服务以.service结尾,⼀般会分为3部分:[Unit][Service][Install],这⾥以xe为例:vim

/usr/lib/systemd/system/e

vim /usr/lib/systemd/system/e

[Unit] #主要是服务说明

Description=test #简单描述服务

After= #描述服务类别,表⽰本服务需要在network服务启动后在启动

Before=e #表⽰需要在某些服务启动之前启动,AfterBefore字段只涉及启动顺序,不涉及依赖关系。

[Service] #核⼼区域

Type=forking #表⽰后台运⾏模式。

User=user #设置服务运⾏的⽤户

Group=user #设置服务运⾏的⽤户组

KillMode=control-group #定义systemd如何停⽌服务

PIDFile=/usr/local/test/ #存放PID的绝对路径

Restart=no #定义服务进程退出后,systemd的重启⽅式,默认是不重启

ExecStart=/usr/local/test/bin/ #服务启动命令,命令需要绝对路径

PrivateTmp=true #表⽰给服务分配独⽴的临时空间

[Install]

WantedBy= #多⽤户

字段说明:

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字段:

: #表⽰多⽤户命令⾏状态,这个设置很重要

: #表⽰图形⽤户状体,它依赖于