systemd服务文件需放指定目录才生效:系统级服务放/etc/systemd/system/或/usr/lib/systemd/system/,用户级服务放$home/.config/systemd/user/;修改后须先daemon-reload再restart。

systemd 服务文件必须放在哪个目录才生效
systemd 不会自动扫描任意路径下的 .service 文件,放错位置等于没写。用户常把配置丢进 /home/xxx/myapp.service 或 /tmp/,结果 systemctl daemon-reload 后仍提示 Unit myapp.service not found。
- 系统级服务(所有用户可用):必须放在
/etc/systemd/system/(推荐)或/usr/lib/systemd/system/(仅限软件包安装) - 当前用户服务(无需 root):放在
$HOME/.config/systemd/user/,且需启用systemctl --user daemon-reload - 临时调试可软链:用
ln -sf /path/to/myapp.service /etc/systemd/system/myapp.service,避免复制出错
ExecStart 命令不执行或立即退出的常见原因
ExecStart 不是 shell 脚本执行环境,默认不走 /bin/sh,也不支持管道、重定向、分号拼接。直接写 ExecStart=python3 app.py & 或 ExecStart=sh -c 'sleep 10 && ./run.sh' 是高频翻车点。
- 后台进程必须加
Type=simple(默认)或显式设为Type=forking,否则 systemd 认为启动失败 - 含重定向或管道时,必须包装成
sh -c "...",例如:ExecStart=/bin/sh -c 'python3 /opt/app/main.py >> /var/log/app.log 2>&1' - 路径务必写绝对路径:
ExecStart=/usr/bin/python3不能简写为python3,因为 systemd 的 PATH 很窄(通常只有/usr/bin:/bin)
如何让服务随系统启动但不阻塞开机流程
如果服务启动慢(比如要连外部 API 或等待硬件就绪),又没正确声明依赖和启动类型,会导致 systemctl reboot 卡住,或登录界面延迟出现。
BIZOSS-B2C是脱胎于贞龙B2B大型平台的网上商城系统、网上商店系统、网上购物系统的企业级B2C电子商务解决方案。系统设置:这里包含了网店的常用功能和全局配置的开关。包括 商店设置 、支付方式和配送方式 、邮件服务器设置、地区列表、友情链接、自定义导航栏、站点地图。商品管理:网店展示商品的核心。其中包括了 商品分类、商品类型、商品品牌、商品回收站、商品上下架等一些设置。促销管理:这个是我们网
- 加
Wants=network-online.target+After=network-online.target,而不是只写After=network.target,后者不保证网络真正可达 - 启动耗时超过 90 秒的服务,必须设置
TimeoutSec=,否则 systemd 会在 90 秒后杀掉进程并标记 failed - 非关键服务建议加
StartLimitIntervalSec=0防止反复崩溃触发启动限制,但得配合日志排查根本原因
修改 service 文件后 systemctl reload 不生效?
很多人改完 .service 文件只运行 systemctl reload myapp.service,但这个命令只重载已加载单元的运行时配置,不会重新读取磁盘上的文件定义。
- 必须先运行
systemctl daemon-reload,它才会扫描磁盘、重建 unit 缓存 - 再执行
systemctl restart myapp.service(不是 reload)才能应用新配置 - 验证是否生效:用
systemctl cat myapp.service看输出是否是你刚改的内容;用systemctl show myapp.service -p ExecStart检查实际解析值
最常被忽略的是 Type= 和 Restart= 的组合逻辑——比如设了 Restart=always 却没配 RestartSec=,服务崩溃后会瞬间重启上百次,触发 systemd 的速率限制而静默失败。









