前提
要自定义一个服务,需要在 /usr/lib/systemd/system/ 下添加一个配置文件:.service
如果 /usr/lib/systemd/system/ 不存在,可考虑使用 /lib/systemd/system/ 或 /etc/systemd/system/
笔者在/etc/systemd/system/目录下定义了long-running-script.service;如下:
[Unit]
Description=Long Running Script Service
After=network.target
[Service]
Type=simple
ExecStart=/home/demo/script.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
配置解释
[Unit]: 服务的启动顺序与依赖关系
Description: 当前服务的简单描述
After: 当前服务(<software-name>.service)需要在这些服务启动后,才启动
Before: 和 After 相反,当前服务需要在这些服务启动前,先启动
Wants:表示当前服务"弱依赖"于这些服务。即当前服务依赖于它们,但是没有它们,当前服务也能正常运行。
Requires: 表示"强依赖"关系,即如果该服务启动失败或异常退出,那么当前服务也必须退出。
[Service] 服务运行参数的设置
Type=forking 后台运行的形式
PIDFile=/software-name/pid pid文件路径
EnvironmentFile=/xxx/prod.env 通过文件设定环境变量,注意这东西不支持环境变量的插值语法 ${xxx}
WorkingDirectory=/xxx/xxx 工作目录
ExecStartPre 为启动做准备的命令
ExecStart 服务的具体运行命令(对非 workingdirectory 的文件,必须用绝对路径!
ExecReload 重载命令,如果程序支持 HUP 信号的话,通常将此项设为 `/bin/kill -HUP $MAINPID`
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
要启动的脚本【/home/demo/script.sh(记得这个路径赋予权限)】如下
#!/bin/sh
while true; do
date_time=$(date +"%Y-%m-%d %T")
echo $date_time
echo $date_time >> /home/demo/test.log
sleep 2
done
该脚本每两秒输出日期时间并输入到log中
然后执行以下
systemctl daemon-reload #重新加载配置文件
sudo systemctl start long-running-script.service # 启动服务
sudo systemctl enable long-running-script.service # 启用服务,即开机自动启动
效果如下
查看状态
sudo systemctl status long-running-script.service # 检查状态
停止服务
sudo systemctl stop long-running-script.service
查看所有服务
systemctl list-units --type=service
取消服务,取消开机启动
systemctl disable ss-server.service # 取消服务,取消开机启动