2012-07-21 26 views
3

我已经编写了一个作为守护进程启动的Java应用程序(我守护程序重定向stderr和stdout并关闭stdin,但bash)。但是,偶尔我希望能够通知此应用程序并通知它更改其某些行为部分。我需要能够从终端向应用程序发送消息,因此任何需要图形工具的应用程序都是不可行的。如何发信号守护进程来改变行为

行为的变化相当简单。我需要在应用程序中切换一个线程的状态,并且可以正常关闭应用程序。

实现这个目标有哪些选择?我知道我可以在进程中有一个线程来侦听某种类型的消息的套接字,但对于我的需求来说,这看起来似乎过度了。

我对Linux/Unix上的Signals不太熟悉,所以我想问问我是否可以简单地为某些信号设置自定义处理程序,并在进程收到信号时执行我的代码。

还有其他的选择,我根本不知道或没有想过?

回答

3

信号可能是最简单的。您有SIGUSR1和SIGUSR2可供应用程序使用,您可以为它们编写处理程序来管理切换。通常你不想在处理程序中做很多事情,所以你可以设置一个开关和你的主循环(或其他)来检查开关并相应地执行。类似地,可以编程接收信号以读取您更改的配置文件。除此之外,你可以使用任何可用的IPC(fifos,套接字,MQ),但是你要么在它们上面有线程阻塞,要么以某种方式将它们合并成一个select语句(或者与之相对应的任何java对象)。

+0

注意:JVM(至少Oracle的)保留一些内部使用的信号。 – 2012-07-21 05:58:27

+0

我最终通过将我的应用程序分成两个不同的应用程序来解决这个问题。但在此之前,我在使用FIFO来做我所需要的方面取得了很大进展。 – 2012-08-09 00:30:01

1

就我个人而言,我喜欢使用OS信号。使用java.lang.Runtime.addShutdownHook并发送SIGTERM,SIGINT或SIGHUP。

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

SignalHandler不是支持的公共接口的一部分,因此您的里程可能会有所不同。

如果您正在使用C代码实例化JVM,只需在JVM之前设置信号处理程序(使用C语言)即可,无需担心。

+0

有关SignalHandler不属于受支持的公共接口的部分让我对使用它有点谨慎。我想保持代码清洁,而不是依赖特定实现的内部功能。我会研究addShutdownHook,可能对我正在做的某些部分有用。 – 2012-07-22 17:06:20

1

您基本上需要一个与您的应用程序(服务器)进行通信的小型客户端。所以默认的解决方案应该是使用一些IPC机制。采用IPC机制是一次性努力,值得这样做,因为它能够满足要求。不建议使用IPC信号。我认为套接字是一个很好的选择。