如何写入服务的标准输入

Ste*_*art 3 systemd

我正在运行一个服务,它有一个连接到标准输入的 CLI。当我ssh进入机器时,我希望能够向该服务的标准输入发送命令。

systemd.exec说这StandardInput=file:/path/to/file是一个东西并且支持 FIFO。这听起来是最简单的方法。

我已经在我的~/.config/systemd/user/foo.service

[Service]
ExecStartPre=mkfifo %t/foo.stdin
ExecStart=cat -
StandardInput=file:%t/foo.stdin
ExecStopPost=rm -f %t/foo.stdin
Run Code Online (Sandbox Code Playgroud)

在此示例中,我希望当我运行以下命令时,我将在日志中看到输出回显。

echo "hello" > /run/user/1000/foo.stdin
Run Code Online (Sandbox Code Playgroud)

我对此有两个问题:

  1. foo.service: Failed to set up standard input: No such file or directory 。看来StandardInput=之前一定存在过ExecStartPre=。在安装过程中,我是否需要在静态位置创建永久管道,或者是否有解决方法?如果我手动创建文件并删除ExecStartPre/ ExecStopPost,那么事情就可以了。
  2. 第一个echo "command"处理得很好,但发送一个EOF并且标准输入关闭。我希望标准输入保持开放。 答案exec 3> stdin,...,exec 3>&-)似乎是使用 bash FD 重定向,但这在 systemd 中不可用。

use*_*170 7

您可以为 FIFO创建一个套接字单元:

按如下方式启动它:

systemctl --user start foo.socket
Run Code Online (Sandbox Code Playgroud)

一旦 FIFO 被写入,服务本身就会启动。如果您希望它立即启动,请像这样启动它:

systemctl --user start foo.service
Run Code Online (Sandbox Code Playgroud)