如何向守护进程发送信号以改变行为

3
我写了一个Java应用程序,作为守护进程启动(我通过bash将stderr和stdout重定向并关闭stdin)。但是,偶尔我想要能够向这个应用程序发送消息,并通知它更改其行为的某些部分。我需要能够从终端向应用程序发送消息,因此任何需要图形实用程序的内容都不行。
行为的更改非常简单。我需要一个开关来切换应用程序中一个线程的状态,以及一种优雅地关闭应用程序的方法。
在实现此目标方面,我的选择有哪些?我知道可以在进程中拥有一个线程,监听某种类型的套接字以获取消息,但这似乎对我所需的功能有些过度。
我对Linux/Unix上的信号不太熟悉,因此我想问一下,我是否可以简单地设置某些信号的自定义处理程序,并在进程接收到信号时执行我的代码。
还有其他的选择吗,我只是不知道或没有考虑到?
3个回答

3
信号可能是最简单的。您可以使用SIGUSR1和SIGUSR2来管理应用程序,并编写处理程序以处理您的切换。一般来说,您不希望在处理程序中做太多事情,因此您可以设置一个开关,您的主循环(或其他内容)需要检查该开关并相应地采取行动。同样,可以编程接收信号以读取您更改的配置文件。
除此之外,您可以使用任何可用的IPC(FIFO,套接字,MQ),但是您需要将线程阻塞在它们上面,或者以某种方式将它们合并到选择语句中(或者Java等效语句)。

注意:JVM(至少是Oracle的)保留了一些信号用于内部使用。 - Paulo Scardine
我最终通过将我的应用程序分成两个不同的应用程序来解决了这个问题。然而,在那之前,我在使用FIFO来完成我所需的工作方面取得了很大进展。 - Varun Madiath

1

个人而言,我喜欢使用操作系统信号来实现这个功能。

使用 java.lang.Runtime.addShutdownHook 并发送 SIGTERM、SIGINT 或 SIGHUP 信号。

请注意,一些信号被保留供内部使用,请查看您所使用的 JVM 的文档。

SignalHandler 不是受支持的公共接口的一部分,因此效果可能有所不同。

如果您正在从 C 代码实例化 JVM,请在 JVM 之前设置信号处理程序(在 C 中),那么就没问题了。


关于SignalHandler不是受支持的公共接口的部分让我有点担心使用它。我想保持代码的清洁,不依赖于特定实现的内部功能。不过我会研究一下addShutdownHook,可能对我正在做的某些部分有用。 - Varun Madiath

1
你需要一个与你的应用程序(服务器)通信的小客户端。因此,默认解决方案应该是使用一些IPC机制。放置IPC机制只需要一次努力,值得这样做,因为它可以很好地满足需求。不建议使用信号进行IPC。我认为套接字是一个不错的选择。

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