• CentOS7编写systemd服务脚本


    转载自https://blog.csdn.net/yuanfangpoet/article/details/89410312

    简介

    在CentOS6中写服务脚本,需要放在/etc/init.d/目录下,且脚本编写较复杂在。而在CentOS7中写服务脚本,只需要按照格式编写即可。

    服务脚本编写

    存放位置

    /usr/lib/systemd/system  #系统服务,开机不需要登录就能运行的程序(可以用于开机自启)

    /usr/lib/systemd/user      #用户服务,需要登录后才能运行程序

    服务脚本编写

    服务脚本一般以xxx.service命名,且脚本中分为三部分:[Unit]、[Service]、[Install]

    示例

    vim /usr/lib/systemd/system/xxx.service 
    [Unit]   # 主要是服务说明
    Description=test   # 简单描述服务
    After=network.target    # 描述服务类别,表示本服务需要在network服务启动后在启动
    Before=xxx.service      # 表示需要在某些服务启动之前启动,After和Before字段只涉及启动顺序,不涉及依赖关系。
     
    [Service]  # 服务的关键
    Type=forking     # 表示后台运行模式。
    PIDFile=/usr/local/test/test.pid    # 存放PID的绝对路径
    ExecStart=/usr/local/test/bin/startup.sh    # 服务启动命令,命令需要绝对路径
    ExecReload=xxx  #为重启命令,
    ExecStop=xxx   #为停止命令
    PrivateTmp=true                               # 表示给服务分配独立的临时空间
       
    [Install]   
    WantedBy=multi-user.target  # 多用户

    字段描述(用时查看即可)

    [Unit]区块字段描述

    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 强依赖,表示等号填写服务启动或失败,那么此配置文件的服务将启动失败
    BindsTo= 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
    Conflicts= 这里指定的 Unit 不能与当前 Unit 同时运行
    Condition... 当前 Unit 运行必须满足的条件,否则不会运行
    Assert... 当前 Unit 运行必须满足的条件,否则会报启动失败

    [Service]区块字段描述

    Type:定义启动时的进程行为。它有以下几种值。
    Type=simple:默认值,执行ExecStart指定的命令,启动主进程
    Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
    Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
    Type=dbus:当前服务通过D-Bus启动
    Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
    Type=idle:若有其他任务执行完毕,当前服务才会运行
    ExecStart:启动当前服务的命令
    ExecStartPre:启动当前服务之前执行的命令
    ExecStartPost:启动当前服务之后执行的命令
    ExecReload:重启当前服务时执行的命令
    ExecStop:停止当前服务时执行的命令
    ExecStopPost:停止当其服务之后执行的命令
    RestartSec:自动重启当前服务间隔的秒数
    Restart:定义何种情况 Systemd 会自动重启当前服务 
        no(默认值): # 退出后无操作
        on-success:  # 只有正常退出时(退出状态码为0),才会重启
        on-failure:  # 非正常退出时,重启,包括被信号终止和超时等
        on-abnormal: # 只有被信号终止或超时,才会重启
        on-abort:    # 只有在收到没有捕捉到的信号终止时,才会重启
        on-watchdog: # 超时退出时,才会重启
        always:      # 不管什么退出原因,都会重启(除了systemctl stop)
        # 对于守护进程,推荐用on-failure
    KillMode的类型:
        control-group(默认):# 当前控制组里的所有子进程,都会被杀掉
        process: # 只杀主进程
        mixed:   # 主进程将收到SIGTERM信号,子进程收到SIGKILL信号
        none:    # 没有进程会被杀掉,只是执行服务的stop命令
    TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
    Environment:指定环境变量

    [Install]字段描述

    WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
        multi-user.target: # 表示多用户命令行状态,这个设置很重要
        graphical.target:  # 表示图形用户状体,它依赖于multi-user.target
    RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
    Alias:当前 Unit 可用于启动的别名
    Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

    更多请参考官方文档

    nginx脚本编写

    [root@n1 ~]# vim /usr/lib/systemd/system/nginx.service 

    [Unit]
    Description=nginx
    After=network.target
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecStop=/usr/local/nginx/sbin/nginx -s stop -c /usr/local/nginx/conf/nginx.conf
    ExecReload= /usr/local/nginx/sbin/nginx -s reload -c /usr/local/nginx/conf/nginx.conf
    PrivateTmp=ture
    [Install]
    WantedBy=multi-user.target

    命令使用:

    #启动、停止服务
     systemctl start nginx.service 
     systemctl stop nginx.service 
     #重启服务
     systemctl reload nginx.service  #服务启动时重启有效
     systemctl restart nginx.service
     #查看nginx服务状态
     systemctl status nginx.service
     #添加服务到开机自启、取消开机自启
     systemctl enable nginx.service
     systemctl disable nginx.service

    配置一个自定义脚本服务

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

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

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

    2、脚本代码

    #!/bin/bash
    #chkconfig: 2345 38 46
    
    . /etc/init.d/functions
    if [ $# -ne 1 ]
    then
     echo "usage: $0 {start|stop|status}"
     exit 1
    fi
    case "$1" in
    start)
     if [ -e "/var/run/inotify.pid" ]
     then
        action "inotify service start fail" /bin/false
        echo "sync server is running......"
        sleep 1
        exit 1
     fi
     /bin/bash /server/scripts/inotify.sh &
     `ps -ef|grep "inotifywait"|grep -v "grep"|awk '{print $2}'` >/var/run/inotify.pid
     if [ `ps -ef|grep inotify|wc -l` -gt 2 ]
     then
        action "inotify service is started" /bin/true
     else
        action "inotify service is started" /bin/false
     fi
     ;;
    stop)
     if [ `ps -ef|grep inotify|grep -v grep|wc -l` -a -e "/var/run/inotify.pid" ]
     then
        rm -f /var/run/inotify.pid >/dev/null 2>&1
        pkill inotifywait
     else
        action "inotify service stop fail" /bin/false
        echo "sync server is not running"
        sleep 1
        exit 1
     fi
     sleep 1
     if [ `ps -ef|grep inotify|grep -v grep|wc -l` -eq 0 -a ! -e "/var/run/inotify.pid" ]
     then
        action "inotify service is stoped" /bin/true
     else
        action "inotify service is stoped" /bin/false
     fi
     ;;
    status)
     if [ `ps -ef|grep inotify|wc -l` -gt 2 ]
     then
        action "inotify service is running"
     else
        action "inotify service is stoped"
     fi
     ;;
    *)
     echo "usage: $0 {start|stop|status}"
     exit 1
    esac

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

    [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

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

    systemctl daemon-reload
    systemctl start syncd

    以下是改进后的服务模版

    #!/bin/bash
    # chkconfig: 2345 10 90 
    # description: myservice ....


    #根据自己的情况替换some-progress为自己的进程名字 . /etc/init.d/functions if [ $# -ne 1 ] then echo "usage: $0 {start|stop|restart|status}" exit 1 fi start() { if [ -n "$(ps -ef | grep "/some-progress"|grep -v grep|grep -v "log"|grep -v "some-progress.sh")" ];then action "some-progress service start fail" /bin/false echo "some-progress is running......" sleep 1 exit 1 fi cd /usr/local/dns/bin/ nohup ./some-progress >/dev/null 2>&1 & ps -ef|grep "/some-progress"|grep -v "grep"|grep -v "log"|grep -v "some-progress.sh"|awk '{print $2}' >/var/run/some-progress.pid if [ `ps -ef | grep "/some-progress"|grep -v grep|grep -v "log"|grep -v "some-progress.sh"|wc -l` -eq 1 ];then action "some-progress service is started" /bin/true else action "some-progress service is started" /bin/false fi } stop() { if [ `ps -ef | grep "/some-progress"|grep -v grep|grep -v "log"|grep -v "some-progress.sh"|wc -l` -a -e "/var/run/some-progress.pid" ] then rm -f /var/run/some-progress.pid >/dev/null 2>&1 ps -ef|grep "/some-progress"|grep -v "grep"|grep -v "log"|grep -v "some-progress.sh"|awk '{print $2}'|xargs kill -9 else action "some-progress service stop fail" /bin/false echo "some-progress service is not running" fi sleep 1 if [ `ps -ef|grep some-progress|grep -v grep|grep -v "log"|grep -v "some-progress.sh"|wc -l` -eq 0 -a ! -e "/var/run/some-progress.pid" ] then action "some-progress service is stoped" /bin/true else action "some-progress service is stoped" /bin/false fi } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) if [ `ps -ef|grep some-progress|grep -v grep|grep -v "log"|grep -v "some-progress.sh"|wc -l` -eq 1 ] then action "some-progress service is running" else action "some-progress service is stoped" fi ;; *) echo "usage: $0 {start|stop|restart|status}" exit 1 esac
  • 相关阅读:
    海量数据处理
    mysql数据导出
    手机归属地
    如何正确合理的建立MYSQL数据库索引
    Java 复杂excel报表导出
    NullpointerException真的一定要被预防?
    代码传递信息方式的探究
    ThreadLoacl的反思
    Codis分布式锁
    spring mvc:事务引起的try/catch失效
  • 原文地址:https://www.cnblogs.com/faberbeta/p/13477407.html
Copyright © 2020-2023  润新知