You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian 9服务器关机/重启前执行脚本被中断问题求助

解决Debian 9关机时脚本被中断的问题

我之前在Debian 9上也踩过一模一样的坑——默认关机流程里,自定义脚本特别容易被systemd直接中断,根本来不及执行完成。核心原因是:systemd不会自动等待用户随便放置的脚本跑完,必须把你的邮件通知脚本注册成专门的systemd关机服务,让系统明确知道要等它执行完毕再推进后续关机流程。

下面是一步步的实操解决方法:

1. 先确保脚本具备执行权限

首先给你的脚本加上可执行权限,避免系统调用时因权限不足报错:

chmod +x /home/vorkbaard/goingdown.sh

另外建议你把脚本里用到的所有命令换成绝对路径(比如邮件命令mail,先跑which mail查看它的路径,比如/usr/bin/mail,然后脚本里就写/usr/bin/mail而非mail)——关机时系统的环境变量PATH会被简化,用相对路径大概率找不到对应命令。

2. 创建systemd服务配置文件

在/etc/systemd/system/目录下新建一个服务文件,比如shutdown-notify.service:

nano /etc/systemd/system/shutdown-notify.service

3. 填写服务配置内容

把下面的内容粘贴进去,我会逐个解释关键字段的作用:

[Unit]
Description=Send shutdown notification email
Before=shutdown.target reboot.target halt.target
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/home/vorkbaard/goingdown.sh

[Install]
WantedBy=multi-user.target
  • Before=...: 告诉systemd,这个服务必须在关机、重启、halt这些系统目标之前执行
  • DefaultDependencies=no: 禁用默认依赖,避免和其他系统服务的执行顺序冲突
  • Type=oneshot: 表示该服务仅执行一次就退出
  • RemainAfterExit=yes: 让systemd知晓,即使服务进程退出,它也处于"活跃"状态,这样关机时才会触发ExecStop逻辑
  • ExecStop: 指定关机时要执行的脚本路径(这里用ExecStop而非ExecStart,因为我们要在服务停止——也就是关机触发时——执行脚本)

4. 启用并测试服务

保存文件后,重新加载systemd配置并启用服务:

systemctl daemon-reload
systemctl enable shutdown-notify.service

先手动测试脚本能否正常发送邮件:

systemctl stop shutdown-notify.service

如果能收到邮件,说明脚本和服务配置都没问题。

5. 验证关机流程

现在可以重启或关机测试了:系统会先执行你的邮件脚本,等它完全跑完后,才会继续推进后续的关机/重启步骤。

如果仍有问题,可以查看服务日志排查细节:

journalctl -u shutdown-notify.service

内容的提问来源于stack exchange,提问作者Forkbeard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:20:02