3

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

行为的改变相当简单。我需要在我的应用程序中切换一个线程的状态,以及一种优雅地关闭应用程序的方法。

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

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

还有其他我根本不知道或没有考虑过的选择吗?

4

3 回答 3

3

信号可能是最简单的。您有 SIGUSR1 和 SIGUSR2 可供应用程序使用,您可以为它们编写一个处理程序来管理您的切换。通常,您不想在处理程序中做太多事情,因此您可以设置一个开关,而您的主循环(或其他)需要检查开关并采取相应措施。同样,可以对信号的接收进行编程,以读取您更改的配置文件。

除此之外,您可以使用任何可用的 IPC(fifos、套接字、MQ),但您将要么对它们进行线程阻塞,要么以某种方式将它们合并为一个select语句(或任何与 java 等效的语句)。

于 2012-07-21T04:58:29.067 回答
1

就个人而言,我喜欢为此使用操作系统信号。

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

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

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

如果您从 C 代码实例化 JVM,只需在 JVM 之前设置信号处理程序(用 C 语言),就可以了。

于 2012-07-21T04:53:50.420 回答
1

您基本上需要一个与您的应用程序(服务器)通信的小型客户端。所以默认的解决方案应该是使用一些IPC机制。设置 IPC 机制是一次性的工作,而且是值得的,因为它可以很好地适应需求。不推荐使用 IPC 信号。我认为套接字是一个很好的方法。

于 2012-07-22T02:24:34.480 回答