service 管理服务 脚本最少需要接收 start 和 stop 选项;

服务启动脚本要根据用户输入的选项:

                              stop  -----> 关闭服务

                              start -----> 启动服务

                              reload -----> 告诉程序重读配置文件,改变程序的运行状态

                              restart ----> 重新启动服务

RedHat 管理服务的一种机制,要在/var/lock/subsys/目录下创建一个锁文件。

[root@node2 rc.d]# vim /etc/init.d/nrped
#!/bin/bash
# chkconfig: 2345 89 11
# description: NRPE DAENON
NRPE=/usr/local/nagios/bin/nrpe
OPTIONS="-c /etc/nagios/nrpe.cfg -d"
lockfile=/var/lock/subsys/nrped
prog=nrped
RETVAL=0
. /etc/rc.d/init.d/functions
start() {
        echo -n $"Starting $prog: "
        daemon   $NRPE $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
stop() {
        echo -n $"Stopping $prog: "
        killproc  -d -10 $NRPE
        RETVAL=$?
        echo
        [ RETVAL = 0 ] && rm -f ${lockfile}
}
reload() {
         echo -n $"Reloading $prog: "
         killproc  $NRPE  -HUP
         echo
}
case "$1" in
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
        ;;
    reload)
       reload
        ;;
    status)
       status  $NRPE
       ;;
     *)
       echo "Usage: $0 start|stop|restart|reload|status"
       ;;
esac
exit 0

 

 

一、CentOS7添加自定义脚本服务说明

在CentOS7下,已经不再使用chkconfig命令管理系统开机自启动服务和条件自定义脚本服务了,而是使用管理unit的方式来控制开机自启动服务和添加自定义脚本服务。在/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等。这里介绍自定义脚本服务,如果想把自定义的脚本变成服务进程,都需要写对应的service配置文件,这样才能被unit所管理(注意:自定义开机自启动服务的.service配置文件必须放在/usr/lib/systemd/system这个目录下面)。服务类别又分为服务又分为系统服务(system)和用户服务(user)。

系统服务:开机不登陆就能运行的程序(常用于开机自启)。

用户服务:需要登陆以后才能运行的程序。

二、编写.service配置文件说明

1、[unit]区块:设置管理启动顺序与依赖关系

Description=服务描述

给出当前服务的简单描述                                              

Documentation=路径或url

给出文档位置

After=服务.target或服务.service           

定义在某些服务之后启动。例如sshd服务启动必须在network.target sshd-keygen.service服务开启之后才能启动,可以使用如下命令查看sshd服务的配置

cat  /usr/lib/systemd/system/sshd.service

Before=服务.target

定义在某些服务之前启动

Wants=服务.service

弱依赖,表示等号填写服务启动或失败,不影响此配置文件服务的启动

Requires=服务.service

强依赖,表示等号填写服务启动或失败,那么此配置文件的服务将启动失败

注意:如果After、Before、Wants、Requires等号后面需要填写多个服务可以用空格隔开。After和Before字段只涉及启动顺序,不涉及依赖关系。Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。

2、[Service]区块:设置启动行为

 •启动命令

ExecStart=命令

定义启动进程时执行的命令

ExecReload=命令

重启服务时执行的命令                                                                                                                                                         

ExecStop=命令

停止服务时执行的命令

ExecStartPre=命令

启动服务之前执行的命令

ExecStartPost=命令

启动服务之后执行的命令

ExecStopPost=命令

停止服务之后执行的命令

所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。例如:ExecStop=-/bin/sh /server/scripts/xx.sh

•启动类型  Type字段定义启动类型。它可以设置的值如下:

simple(默认值)

ExecStart字段启动的进程为主进程

forking

ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行)

oneshot

类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务

dbus

类似于simple,但会等待 D-Bus 信号后启动

notify

类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务

idl

类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

•重启行为 

KillMode字段,定义Systemd如何停止服务,它可以设置的值如下

control-group(默认值)

当前控制组里面的所有子进程,都会被杀掉

process

只杀主进程

mixed

主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号

none

没有进程会被杀掉,只是执行服务的 stop 命令

Restart字段,定义了服务退出后,Systemd的重启方式,它可以设置的值如下

no(默认值)

退出后不会重启

on-success

只有正常退出时(退出状态码为0),才会重启

on-failure

非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启

on-abnormal

只有被信号终止和超时,才会重启

on-abort

只有在收到没有捕捉到的信号终止时,才会重启

on-watchdog

超时退出,才会重启

always

不管是什么退出原因,总是重启

•service区块的其他一些字段

EnvironmentFile=文件路径

指定当前服务的环境参数文件

RestartSec=数值

表示Systemd重启服务之前,需要等待的秒数

PIDFile=PID文件路径

PID进程文件

KillSignal=信号量

停止信号量,值一般为SIGQUIT

TimeoutStopSec=数值

停止超时时间

PrivateTmp=布尔值

独立空间true或false,即文件系统名字空间的配置将被该命令行启动的进程忽略

3、[Install]区块:定义如何安装这个配置文件,即怎样做到开机启动

这个设置非常重要,如果设置开机自启动,在/etc/systemd/system目录下面的multi-user.target.wants子目录之中机会创建一个服务的软链接

WantedBy字段,表示该服务所在的 Targe,target的含义是服务组,表示一组服务,它可以设置的值如下

multi-user.target

表示多用户命令行状态

graphical.target

表示图形用户状态,它依赖于multi-user.target                                                                                                 

三、注册服务实例

配置文件目录

systemctl脚本目录

/usr/lib/systemd/ 

系统服务目录

/usr/lib/systemd/system/ 

用户服务目录

/usr/lib/systemd/system/

四、配置一个自定义脚本服务

 这里写一个rsync+inotify的脚本服务(注意:此脚本是在centos6直接拿过来用的,在centos6可以直接使用chkconfig管理,这里只是测试,勿喷)

1、创建脚本目录(为什么不要centos自带的脚本目录呢?这是为了方便管理)

mkidr -p /server/scripts/sync.sh
vim /server/scripts/sync.sh

2、脚本代码

centos7 shell脚本 centos service脚本_centos7 shell脚本

 View Code

3、添加注册脚本服务文件(vim /usr/lib/systemd/system/syncd.service),文件内容如下

centos7 shell脚本 centos service脚本_重启_02

[Unit]
Description="这是rsync+inotify实时同步服务"
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/bin/sh /server/scripts/sync.sh start
ExecReload=/bin/sh /server/scripts/sync.sh restart
ExecStop=/bin/sh /server/scripts/sync.sh stop
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

centos7 shell脚本 centos service脚本_重启_02

4、运行systemctl start syncd命令启动服务

 

一、添加开机自启服务

在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例):

systemctl enable jenkins.service #设置jenkins服务为自启动服务
sysstemctl start  jenkins.service #启动jenkins服务

二、添加开机自启脚本

在centos7中增加脚本有两种常用的方法,以脚本autostart.sh为例:

#!/bin/bash
#description:开机自启脚本
/usr/local/tomcat/bin/startup.sh  #启动tomcat

方法一

1、赋予脚本可执行权限(/opt/script/autostart.sh是你的脚本路径)

chmod +x /opt/script/autostart.sh

2、打开/etc/rc.d/rc/local文件,在末尾增加如下内容

/opt/script/autostart.sh

3、在centos7中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限

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

方法二

1、将脚本移动到/etc/rc.d/init.d目录下

mv  /opt/script/autostart.sh /etc/rc.d/init.d

2、增加脚本的可执行权限

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

3、添加脚本到开机自动启动项目中

cd /etc/rc.d/init.d
chkconfig --add autostart.sh
chkconfig autostart.sh on

以上两种方法均已在centos7系统上验证过,如有疑问,欢迎大家评论留言