我需要捕获任何操作系统关闭并在关闭操作系统之前执行一些操作。我正在使用 Fedora 19 和 C++。
我可以使用以下 C++ 代码捕获控制台发出的关闭信号:
myAct.sa_handler = myStructure::mySignalHandler;
sigaction(mySignal, &act, NULL);
该信号可以通过在关闭之前执行自定义代码来mySignal
激活。/etc/init.d
在 Fedora 12 Kernel 2.6 上,该解决方案完美运行。如果我尝试使用图形界面关闭计算机,该解决方案适用于 Fedora 19 Kernel 3.9.5。
但是,当在终端中使用命令重新启动或关闭 Fedora 19 内核 3.9.5 上的计算机时,我无法执行我的代码。该解决方案不再起作用,因为它删除了常用的init.d
脚本系统。
把我的脚本放在该/usr/lib/systemsd
位置不起作用,脚本被执行,但其他脚本也被执行。因此,系统关闭而不处理我的命令。
我该如何解决这个问题?
答案1
该信号可以从运行过程。因此,如果您在启动时启动一个长期存在的进程(又名守护进程),那么您确实会从该进程收到一个 SIGTERM,并从信号处理程序中执行您想要的任何操作。然而,这是最糟糕的方法:一个额外的进程什么都不做,只是等待信号到达。
你有更好的方法来实现这一目标,尤其是。与 systemd。单元文件 ( foo.service
) 如下所示:
[Unit]
Description=Perform my actions
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/path/to/your/application
但是,请记住,由于 systemd 的并行特性,该单元可以在关闭过程中任意晚启动(尽管这可能会受到仔细使用依赖项的影响)。