将参数传递并解析到 running/online systemd 守护程序

Pass and parse arguments to running/online systemd daemon

我正在从 C/C++ 编译的可执行文件创建 systemd 守护进程。但是,当程序运行时,我希望能够更改一些程序参数。 (与 Linux 上的其他守护进程一样)。

我的意思是,例如,通过命令行在我的进程中更改“destination_server_ip”变量,可能使用类似

的内容

systemctl myProgram --destIP="1::2::3::4:5"

有没有标准的方法/框架来实现这个?

正如 Vollfeiw 在他们对您的问题的评论中所建议的那样,您真的可能想在您的应用程序中创建自己的界面来执行此操作。

我真的不认为这基本上是更新应用程序内部状态的良好设计选择 - 但如果您非常希望能够使用 systemctl 实用程序来更新应用程序的状态您的程序,您可以利用的一种机制是 UNIX 信号。

  • 在您的程序中实现一个信号处理程序(执行此操作的方式因语言和框架而异,如果您不熟悉,请查找一些教程)。在 UNIX 上,保留了两个信号供您使用,但您认为合适 - SIGUSR1 和 SIGUSR2。使用任何其他信号也可以,但会违反约定,因此您可能不应该这样做。
  • 此后,您可以使用 systemctl 的 --signal 标志来提醒程序它应该做某事
  • UNIX 信号不能携带有效载荷,因此您将不得不让程序知道如何以其他方式加载它想要的数据(例如,可能在发送信号之前写入文件)。

老实说,此时您在功能上基本上处于与公开网络套接字或类似东西相同的复杂程度。不要打死马,但你应该因此而硬着头皮做一个网络界面。 :) 但是您在技术上也能够通过这种方式完成您想要的工作。

如果您希望能够在本地完成所有操作,而不是让人们使用 curl 或浏览器或其他任何方式进行配置,您可以编写自己的 CLI 客户端来管理您的守护进程,您可能需要这样做使用 UNIX 套接字(例如与 TCP 或 UDP 套接字相对)作为您的基本通信技术。这是一些守护进程项目中的模式(看到服务的守护进程部分以“d”结尾,表示“守护进程”,然后是服务的客户端部分,用于控制守护进程,以“c”结尾”或“ctl”,表示“控制”。执行此操作的服务的一个示例是 NTP 服务 chrony,它使用 chronyd 来管理计算机的计时,并为用户提供一个 chronyc CLI 界面,以告诉 chronyd 以不同的方式做事。

大多数程序员会发现公开 Web 界面更容易。