【问题标题】:How to detect restart before terminating program on Linux如何在 Linux 上终止程序之前检测重启
【发布时间】:2014-12-01 19:30:38
【问题描述】:

我想在它终止我在 Linux 上的程序之前检测到系统正在重新启动。 我尝试使用 /var/run/utmp 文件来检测运行级别,将 inotify 放在其更改上,但似乎系统在我收到信号之前正在关闭该程序。如果我用 telinit 命令设置运行级别,我会用它来捕捉关机,但如果我只是用 Ubuntu 右上角的按钮重新启动,就不会捕捉到它。

知道怎么做吗?

【问题讨论】:

  • 通常重启的事情会向你的进程发送一个SIGTERM。为什么抓不到?见signal(7)
  • 作为一个在盒子上运行的程序,你知道你为什么被关闭是你的事吗,如果你有状态,你不只是想保存状态并在任何一种情况下退出吗?

标签: linux detect restart runlevel


【解决方案1】:

捕捉SIGTERM 信号并快速保存/执行任何操作,然后退出。大约有 10 秒钟的时间,您将获得无法捕捉到的 SIGKILL,并且您将被强制终止。

如果系统没有向您发送SIGTERM 以允许正确关闭,请将您的系统更改为正确的,这是执行此操作的标准方法。

有关信号处理,请参阅 man 7 signalman 3 sigaction

(请注意,我不知道检查系统是否正在重新启动的标准方法,我认为不存在这种情况。但如上所述,一个合适的系统发给你SIGTERM,让你清理/退出。不包括硬重启,因为这几乎相当于拔掉电源线。)

【讨论】:

  • 你的意思是捕获 sigterm 然后检查运行级别?
  • @JaniBaramidze 我不知道检查系统是否正在重新启动的标准方法。例如,自从我运行 systemd 以来,我的系统上没有运行级别。通过捕获SIGTERM,您可以解决重启问题并引入适当的关闭,例如,当进程管理器也出于任何其他原因想要关闭您时。
  • @JaniBaramidze 为什么需要将“重启前”关机和“常规关机”分开?
  • 什么意思?如果系统在杀死我的程序之前正在重新启动/关闭,我只需要写入某个文件
  • @JaniBaramidze 无论您的系统是否正在重新启动,都可以告诉进程关闭。因此,对于您上面的第一条评论,我想知道为什么您需要在收到 SIGTERM 后检查运行级别?例如,当您在控制台中键入 reboot 时,您的程序应该从您的 init 守护程序(通常)获得一个 SIGTERM 信号。 SIGTERM 用于告诉进程/程序它应该保存它的东西/清理然后退出。我想知道重启部分是否重要?
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多