情况
计算机(运行 Ubuntu 14.04)连接到网络化的控制计算机本身电源的设备。
收到特定信息后signal A
,计算机必须signal B
向该网络设备发送一个命令(除其他外)将切断计算机的电源。
问题
我应该什么时候将其发送signal B
到联网设备,以尽量减少断电造成的损害?
signal A
我假设我可以使用关闭序列中的某处 send 来触发关闭序列signal B
。但我应该什么时候真正发送呢?
我想我的/etc/rc0.d
会像下面这样
K98signalB # Actually sends signalB to cut power
K99networking # Renamed from K01networking, since I need to keep networking alive
答案1
假设是linux
几年前我研究过类似的事情。我无法回答的问题是网络是否仍然可以在适当的时间使用。
要真正拔掉电源插头,而不是尝试连接到 SystemD 或 sysvinit,您确实应该尝试使用内核 mod 直接连接到内核。
当我搜索这个主题时,我最终在这里找到了一些信息:Linux 内核的系统关闭内部是如何工作的?
这让我找到了这里的内核代码: https://elixir.bootlin.com/linux/v5.0.5/source/arch/arm64/kernel/process.c#L136
void machine_power_off(void)
{
local_irq_disable();
smp_send_stop();
if (pm_power_off)
pm_power_off();
}
要正确执行此操作,您需要编写一个内核模块,其中包含通过网络与电源开关通信的函数,然后在函数指针中注册您的函数pm_power_off
。
触发系统关闭可能更加依赖于系统。最简单的方法可能是调用现有的命令行程序,例如sutdown
或poweroff
。