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  # 查看所有服务
    

    参考

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/kirito-c/p/10331598.html
Copyright © 2011-2022 走看看