假设我们要创建一个名为 myservice 的服务,它运行一个简单的 Bash 脚本。
1. 创建一个可执行脚本(可选)
例如,创建一个脚本 /usr/local/bin/myservice.sh:
bash编辑#!/bin/bash
while true; do
echo "$(date): My service is running..." >> /var/log/myservice.log
sleep 10
done
赋予执行权限:
sudo chmod +x /usr/local/bin/myservice.sh
2. 创建 systemd 服务文件
在 /etc/systemd/system/ 目录下创建服务单元文件,例如 myservice.service:
[Unit]
Description=My Custom Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myservice.sh
Restart=always
RestartSec=5
User=nobody
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
说明:
[Unit]:描述服务和依赖关系。Description:服务描述。After:在网络启动后再启动服务。
[Service]:定义服务如何运行。Type=simple:主进程就是ExecStart启动的进程。ExecStart:要执行的命令。Restart=always:崩溃或退出后自动重启。User:以哪个用户身份运行(建议不要用 root,除非必要)。StandardOutput/StandardError:日志输出到 systemd journal。
[Install]:定义启用服务时的行为。WantedBy=multi-user.target:表示服务在多用户模式下启动。
3. 重载 systemd 配置并启用服务
# 重载 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
# 启用服务(开机自启)
sudo systemctl enable myservice.service
# 启动服务
sudo systemctl start myservice.service
4. 查看服务状态和日志
# 查看服务状态
sudo systemctl status myservice.service
# 查看日志(使用 journalctl)
sudo journalctl -u myservice.service -f
补充建议
- 如果脚本不需要常驻运行(比如只执行一次),可以把
Type=simple改为Type=oneshot,并去掉循环。 - 日志也可以写入文件,比如用
StandardOutput=append:/var/log/myservice.log(需 systemd ≥ 240)。 - 调试时建议先手动运行脚本,确保无误再做成服务。
如果服务不用了,如何删除呢?
要彻底卸载一个自定义的 systemd 服务( myservice.service),请按以下步骤操作,确保不留残留:
✅ 步骤 1:停止并禁用服务
停止正在运行的服务
sudo systemctl stop myservice.service
# 禁用开机自启(移除符号链接)
sudo systemctl disable myservice.service
💡
disable会自动删除/etc/systemd/system/multi-user.target.wants/myservice.service等启用链接。
✅ 步骤 2:删除服务单元文件
删除主服务文件
sudo rm /etc/systemd/system/myservice.service
⚠️ 确保路径正确。如果用的是其他名字(如
my-service.service),请替换。
✅ 步骤 3:重载 systemd 配置
sudo systemctl daemon-reload
sudo systemctl reset-failed # 可选:清除失败状态记录
这会让 systemd 忘记这个服务的存在。
✅ 步骤 4:清理相关文件(可选但推荐)
a) 删除服务脚本(如果不再需要)
例如之前放在 /usr/local/bin/myservice.sh
sudo rm /usr/local/bin/myservice.sh
b) 删除日志文件(如果手动创建了)
sudo rm /var/log/myservice.log
c) 删除专用用户(如果为它创建过)
# 查看是否存在
id myservice
# 删除用户(不删除家目录,因为本来就没创建)
sudo userdel myservice
如果用的是
nobody,不要删除,它是系统用户!
✅ 步骤 5:验证是否卸载干净
# 应该提示 "not found" 或 "not loaded"
systemctl status myservice.service
# 搜索是否还有残留文件
ls /etc/systemd/system/myservice*
# 应该无输出