使用C#跨平台监听系统重新启动/关机事件

11

如果只考虑Windows环境,我可以使用Microsoft.Win32.SystemEvents.SessionEnding

有没有跨平台的解决方案?我想要一个既能在Windows上工作,也能在Linux上工作的方案。我将使用.NET 6.0。


我认为没有任何相当于那个Windows特定类的东西。可能这源于*nix中没有单一的会话接口(每个登录管理器和窗口管理器都可以有自己的信号集)。我能找到的最接近的东西是PosixSignal,它至少允许您检测系统尝试关闭您的程序的时间 - 无论原因如何。 - fredrik
@fredrik PosixSignal 看起来很有趣,但它只是一个枚举。我该如何监听它?我猜肯定有一种事件可以订阅吧? - igg
看看命名空间中的其他类。例如,PosixSignalRegistration。 - fredrik
1个回答

6
据我所知,在Linux环境下甚至跨平台解决方案中,没有直接可靠的方法来确定这一点。您需要实现一个特定于Linux的方法来检测这个问题。
正如@fredrik在评论中提到的那样,使用PosixSignal可以让您知道应用程序被要求终止,但不知道原因。尽管如此,在接收到SIGTERM时,您仍然可以检查情况以确定系统是否正在关闭。例如,运行systemctl is-system-running将返回“stopping”(如果是这种情况)。
如果我们假设一个现代的Linux桌面环境,一个更强大的替代方案可能是订阅D-bus信号PrepareForShutdown。从systemd文档中可以看到:
“当请求系统挂起或关闭并即将执行时,以及在挂起/关闭完成(或失败)后,都会发出PrepareForShutdown()和PrepareForSleep()信号......”

Tmds.Dbus提供了一个异步API,可以在您的.NET应用程序中监听该信号。您仍然需要处理您将按顺序接收此信号和SIGTERM的事实。


2
谢谢,你的回答非常详细,让我对该问题有了很好的了解。在悬赏期限内,我会保持问题开放,如果没有更好的答案,我会授予给你。 - igg
@igg 谢谢,如果你认为可以的话,你也可以接受这个答案。随着更多的服务器组件也采用了D-Bus,我认为这个答案仍然适用。 - undefined
我认为你的回答很好,但由于问题最初是以“跨平台”方式提出的,我认为它不符合被接受的答案的条件。如果没有办法以跨平台的方式进行这个检查,那么我愿意将这个问题保持开放,直到有解决办法为止。 - undefined
@igg问“有吗?”答案是“没有”,但你说了算,我猜。 - undefined
答案是“今天没有”。这个问题可以保持开放,可以在未来几年内回答。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接