我编写了一个作为守护进程启动的Java应用程序(我守护进程重定向stderr和stdout并通过bash关闭stdin)。但是,偶尔我希望能够发送此应用程序并通知它更改其行为的某些部分。我需要能够从终端向应用程序发送消息,所以任何需要图形工具的东西都是禁止的。
行为的变化相当简单。我需要切换应用程序中一个线程的状态,以及一种优雅地关闭应用程序的方法。
实现这一目标有哪些选择?我知道我可以在进程中有一个线程来监听某种类型的套接字消息,但这对于我的需求来说似乎有些过分。
我对Linux / Unix上的Signals不太熟悉,所以我想问一下我是否可以简单地为某些信号设置自定义处理程序,并在进程收到信号时执行代码。
还有其他一些我根本不知道或没有想过的选择吗?
答案 0 :(得分:3)
信号可能是最简单的。您可以使用SIGUSR1和SIGUSR2供应用程序使用,您可以为它们编写处理程序来管理切换。通常你不想在处理程序中做很多事情,所以你可以设置一个开关,你的主循环(或其他)需要检查开关并相应地采取行动。同样,可以对信号的接收进行编程,以读取您更改的配置文件。
除此之外,您可以使用任何可用的IPC(fifos,套接字,MQ),但是您要么对它们进行线程阻塞,要么以某种方式将它们合并为select
语句(或者与Java相当的任何语句)
答案 1 :(得分:1)
就个人而言,我喜欢使用操作系统信号。
使用java.lang.Runtime.addShutdownHook并发送SIGTERM,SIGINT或SIGHUP。
请注意,某些信号是保留供内部使用的,请查看您正在使用的JVM的文档。
SignalHandler不属于受支持的公共界面,因此您的里程可能会有所不同。
如果要从C代码实例化JVM,只需在JVM之前设置信号处理程序(在C中),就可以了。
答案 2 :(得分:1)
您基本上需要一个与您的应用程序(服务器)通信的小型客户端。所以默认的解决方案应该是使用一些IPC机制。建立IPC机制是一次性的努力并且值得麻烦,因为它可以很好地满足要求。建议不要使用IPC信号。我认为插座是一个很好的方法。