关闭linux然后切断电源的正确方法是什么?

关闭linux然后切断电源的正确方法是什么?,linux,raspberry-pi,shutdown,Linux,Raspberry Pi,Shutdown,我在带有外部电源的raspberrypi板上运行Linux raspberrypi 3.6.11+。电源“关闭”开关通过GPIO控制 我想做一个“shutdown-h-p now”,等待系统关闭(halt),然后运行一个程序(killpower)来切换相应的gpio引脚,从而切断电源。我的主要目标是确保文件系统处于断电时不会损坏的状态 我试图利用运行级别1脚本killproc,它向每个正在运行的进程发送SIGTERM(和SIGKILL)。我编写了killpower来捕获SIGTERM,等待20秒

我在带有外部电源的raspberrypi板上运行Linux raspberrypi 3.6.11+。电源“关闭”开关通过GPIO控制

我想做一个“shutdown-h-p now”,等待系统关闭(halt),然后运行一个程序(killpower)来切换相应的gpio引脚,从而切断电源。我的主要目标是确保文件系统处于断电时不会损坏的状态

我试图利用运行级别1脚本killproc,它向每个正在运行的进程发送SIGTERM(和SIGKILL)。我编写了killpower来捕获SIGTERM,等待20秒,然后发送gpio powerkill序列。我还修改了killproc脚本,使其即使在SIGTERM超时后仍在运行,也不SIGKILL我的killpower pid

当这不起作用时,我发现在killproc运行之后,/init.d/halt脚本运行,它调用/sbin/halt/sbin/halt也会使用SIGKILL杀死所有进程,所以我希望我的killpower程序在20秒之前被杀死。现在,我看不出这种方法将如何发挥作用

我还看到init可以作用于SIGPWR信号(不推荐),但它可以执行powerwait/powerfail。此时系统是否处于关闭电源的状态?我似乎不知道这些计划应该实施什么

我曾考虑在init.d中安装另一个关机脚本,但我不知道它应该“停止”在哪个运行级别(级别1或级别0)


关闭命令执行/sbin/halt之前关闭电源可以吗?一旦执行/sbin/halt,其他任何操作都不会运行,这是正确的吗?

当我远程登录linux设备时,我关闭它的方式就是简单地使用“poweroff”命令。然后系统正常关闭,最后自动关闭——没有更多,也没有更少,这正是我想要的。

关机与停止-p相同。如果在非运行级别0时调用halt,则调用shutdown。关机最终会将系统带到运行级别0,然后调用halt。我需要一个hook-into-halt来实际命令关闭电源。如果您担心会损坏文件系统,那么在所有其他可能保持文件打开以供写入的进程(例如rsyslogd)被终止后,尝试使用
ro
(readonly)选项重新安装fs如何。如果只读重新安装成功,那么在不损坏任何东西的情况下关闭电源应该是安全的。不确定重新装载是否会刷新现金,因此可能需要添加对
sync
的调用。查看/etc/rc0.d脚本,有umountfs和umountroot,它们正是这样做的:重新装载fs ro。我已经将我的“killpower”程序在这之后执行,但在停止之前。我认为真正的解决方案可能是用ACPI重建内核,但那可能是另一天。