我正在学习如何使用 systemd 通知。我认为这是一种机制,它允许一个进程向另一个进程发送通知。
因此,我尝试使用命令发出通知systemd-notify --ready --status="hello"
。然后我得到一个错误:No status data could be sent: $NOTIFY_SOCKET was not set
。似乎它需要一个监听器,就像套接字一样。但我不知道如何让听众接收这个通知。
另外,我知道 systemd 的服务有一些不同的类型,其中之一是notify
. 医生说,Type=notify: identical to Type=simple, but with the stipulation that the daemon will send a signal to systemd when it is ready.
。所以看起来通知类型的服务也可以发送通知,但我也不知道如何使用它。
该
systemd-notify
工具专门用于作为 systemd 服务运行的 shell 使用Type=notify
。如果您使用 设置服务
Type=notify
,systemd 将自动设置回 systemd 的通信套接字,并将其路径导出到下的服务$NOTIFY_SOCKET
。它还将监听该套接字中的特殊消息,例如服务是否准备好(在这种情况下,systemd 会将其转换为 status
started
,因为初始化已完成)以及服务的自我报告状态,这也将被报告在systemctl status mytest.service
(假设有一个名为mytest
.)的服务的输出中您可以阅读手册页
systemd-notify
了解所有详细信息,即使那里有很多复杂性......也许最后的示例有助于说明它是如何工作的。让我们使用该示例进行动手实验!
在系统某处创建如下脚本,例如
/usr/local/bin/mytest.sh
:我添加了一些s 以便您在观看输出
sleep 10
时可以看到发生了什么。systemctl status mytest.service
使脚本可执行:
然后创建
/etc/systemd/system/mytest.service
,内容:然后重新加载 systemd(以便它了解该单元)并启动它:
然后每隔一段时间观察状态输出:
您将看到它
starting
在前 10 秒内,之后它将是started
并且其状态将是“等待数据......”。现在将一些数据写入 FIFO(您需要使用
tee
它以 root 身份运行它):并观察状态:
它将显示服务状态为“处理某些数据”10 秒,然后返回“等待数据...”。
如果您要用 C 或其他支持 systemd 绑定的语言编写此代码,您将
sd_notify()
为此目的使用该函数。如果您熟悉 C,您可能需要查看sd_notify(3)手册页。不是一个完整的答案,但我得到了这个,使用“netcat”
A)在一个终端会话中,执行:
B)打开另一个终端会话并执行:
这行得通,但
netcat
另一方面你会得到nc: connect: Invalid argument
. 我不知道如何解决这个问题。要了解消息格式 sd_notify,可以试试这个:
1号航站楼:
2号航站楼:
您将在终端 1 中看到结果: