zoukankan      html  css  js  c++  java
  • 通过 systemctl 设置自定义 Service

    如果要在Linux 上设置一个开机自启,出现问题自动重启,并且有良好日志的程序,比较流行的方法有 supervisord、systemd,除此之外,还有 upstart、runit 等类似的工具。
    但是自从 systemd 被 ubuntu、centos 等主流 Linux 发行版应用以来,systemd 渐渐成为主流方案。

    配置说明

    要自定义一个服务,需要在 /usr/lib/systemd/system/ 下添加一个配置文件:<software-name>.service

    如果 /usr/lib/systemd/system/ 不存在,可考虑使用 /lib/systemd/system//etc/systemd/system/

    配置文件的内容说明:

    [Unit]: 服务的启动顺序与依赖关系
    Description: 当前服务的简单描述
    After: 当前服务(<software-name>.service)需要在这些服务启动后,才启动
    Before: 和 After 相反,当前服务需要在这些服务启动前,先启动
    Wants:表示当前服务"弱依赖"于这些服务。即当前服务依赖于它们,但是没有它们,当前服务也能正常运行。
    Requires: 表示"强依赖"关系,即如果该服务启动失败或异常退出,那么当前服务也必须退出。
    
    
    [Service] 服务运行参数的设置
    Type=forking  后台运行的形式
    PIDFile=/software-name/pid   pid文件路径
    EnvironmentFile=/xxx/prod.env  通过文件设定环境变量
    WorkingDirectory=/xxx/xxx    工作目录
    ExecStartPre  启动前要做什么(为启动做准备)
    ExecStart  服务的具体运行命令(对非 workingdirectory 的文件,必须用绝对路径!因为 systemd 不使用 shell,也就不查找 PATH)
    ExecReload  重载命令
    ExecStop  停止命令
    ExecStartPre:启动服务之前执行的命令
    ExecStartPost:启动服务之后执行的命令
    ExecStopPost:停止服务之后执行的命令
    RuntimeDirectory=xxxx
    RuntimeDirectoryMode=0775
    PrivateTmp=True  表示给服务分配独立的临时空间
    RestartSec  自动重启当前服务间隔的秒数
    Restart  定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure 等
    # 程序的 user 和 group
    User=ryan
    Group=ryan
    
    
    注意:启动、重载、停止命令全部要求使用绝对路径
    
    [Install] 定义如何安装这个配置文件,即怎样做到开机启动。
    # Target的含义是服务组,表示一组服务。
    WantedBy=multi-user.target
    

    注意,service 文件不支持行内注释!!!注释必须单独一行

    Type 说明

    1. Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。

    2. Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。

    3. Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态

    4. Type=notify:与 Type=simple相同,但约定服务会在就绪后向systemd发送一个信号。这一通知的实现由 libsystemd-daemon.so提供。

    5. Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

    更详细的见 Systemd 入门教程:命令篇 - 阮一峰

    配置举例

    比如 shadows*ks Server Service,的配置文件 ss-server.service 的内容为:

    [Unit]
    Description=ss Server Service
    After=network.target
    
    [Service]
    Type=simple
    User=nobody
    ExecStart=/usr/bin/ssserver -c /etc/ss/ss.json -d start
    ExecStop=/usr/bin/ssserver -c /etc/ss/ss.json -d stop
    
    [Install]
    WantedBy=multi-user.target
    

    而 enginx 的配置文件 nginx.service 的内容是:

    [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
    

    服务的启动、关闭

    systemctl enable ss-server.service  # 启用服务,即开机自动启动
    systemctl disable ss-server.service  # 取消服务,取消开机启动
    
    systemctl start ss-server.service   # 启动服务
    systemctl stop ss-server.service   # 停止服务
    
    systemctl restart ss-server.service   # 重启服务(stop + start)
    systemctl reload ss-server.service   # 服务不 stop,直接加载配置更新等(对应 ExecReload)
    
    # 检查状态
    systemctl status ss-server.service -l
    
    systemctl list-units --type=service  # 查看所有服务
    

    参考

  • 相关阅读:
    组合模式
    HashMap,ArrayList扩容
    Maven入门使用(一)
    OutputStreamWriter API 以及源码解读
    java.io.BufferedWriter API 以及源码解读
    java.io.writer API 以及 源码解读
    自定义redis序列化工具
    策略模式
    Spring下redis的配置
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/kirito-c/p/10331598.html
Copyright © 2011-2022 走看看