【发布时间】:2014-08-28 16:09:59
【问题描述】:
我在带有外部电源的 raspberrypi 板上运行 Linux raspberrypi 3.6.11+。电源“关闭”开关由 GPIO 控制。
我想执行“shutdown -h -P now”,等待系统关闭(停止),然后通过运行程序 (killpower) 来切换适当的 gpio 引脚来切断电源。我的主要目标是确保文件系统处于断电时不会损坏的状态。
我尝试利用运行级别 1 脚本 killproc 向每个正在运行的进程发送 SIGTERM(和 SIGKILL)。我写了 killpower 来捕获 SIGTERM,等待 20 秒,然后发送 gpio powerkill 序列。我还修改了 killproc 脚本以不 SIGKILL 我的 killpower pid,即使它在 SIGTERM 超时后仍在运行。
当这不起作用时,我发现在 killproc 运行之后,/init.d/halt SCRIPT 运行,它调用 /sbin/halt。 /sbin/halt 还使用 SIGKILL 杀死所有进程,所以我希望我的 killpower proc 在 20 秒结束之前被杀死。现在,我不明白这种方法将如何发挥作用。
我还看到 init 可以作用于 SIGPWR 信号(不推荐),但它可以执行 powerwait/powerfail。此时系统是否处于关机状态?我似乎无法找出这些程序应该实现什么。
我曾考虑在 init.d 中安装另一个关闭脚本,但我对它应该“停止”在哪个运行级别(级别 1 或级别 0)感到困惑。
是否可以在 /sbin/halt 因关闭命令而执行之前关闭电源?我是否正确,一旦 /sbin/halt 被执行,其他任何东西都不会运行?
【问题讨论】:
-
如果您担心损坏您的文件系统,在所有其他可能保持文件打开以供写入的进程已被杀死(例如 rsyslogd )。如果以只读方式重新挂载成功,那么在不损坏任何内容的情况下终止电源应该是安全的。不确定重新安装是否会刷新现金,所以可以添加对
sync的调用。 -
查看 /etc/rc0.d 脚本,有 umountfs 和 umountroot 正是这样做的:重新挂载 fs ro。我已经让我的“killpower”过程在此之后执行,但在停止之前。我认为真正的解决方案可能是使用 ACPI 重建内核,但这可能是另一天。
标签: linux raspberry-pi shutdown