【问题标题】:How to signal daemon process to change behaviour如何向守护进程发出信号以改变行为
【发布时间】:2012-07-21 04:21:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java linux signals daemon


    【解决方案1】:

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

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

    【讨论】:

    • 注意:JVM(至少是 Oracle 的)保留一些信号供内部使用。
    • 我最终通过将我的应用程序分成两个不同的应用程序来解决问题。但是在此之前,我在使用 FIFO 做我需要的事情方面取得了很大进展。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • SignalHandler 不属于受支持的公共接口的部分让我对使用它有点警惕。我想保持代码干净,而不是依赖特定实现的内部功能。不过,我会研究 addShutdownHook,它可能对我正在做的某些部分有用。
      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多