将参数传递和解析到运行/在线 systemd 守护进程

问题描述

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

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

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

是否有标准的方法/框架来实现这一点?

解决方法

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

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

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

老实说,在这一点上,您在功能上基本上处于与公开 Web 套接字或类似内容相同的复杂程度。不要打败一匹死马,但因此您可能应该咬紧牙关并制作一个网络界面。 :) 但是从技术上讲,您也可以通过这种方式完成您想要的工作。

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

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