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
相关产品推荐
相关产品推荐

