如何创建一个systemd服务

假设我们要创建一个名为 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*
# 应该无输出