我正在运行一个服务,它有一个连接到标准输入的 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)
我对此有两个问题:
foo.service: Failed to set up standard input: No such file or directory 。看来StandardInput=之前一定存在过ExecStartPre=。在安装过程中,我是否需要在静态位置创建永久管道,或者是否有解决方法?如果我手动创建文件并删除ExecStartPre/ ExecStopPost,那么事情就可以了。echo "command"处理得很好,但发送一个EOF并且标准输入关闭。我希望标准输入保持开放。 答案(exec 3> stdin,...,exec 3>&-)似乎是使用 bash FD 重定向,但这在 systemd 中不可用。您可以为 FIFO创建一个套接字单元:
foo.socket:
[Socket]
ListenFIFO=%t/foo.stdin
Service=foo.service
Run Code Online (Sandbox Code Playgroud)
foo.service:
[Service]
ExecStart=/bin/cat -
Sockets=foo.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal
Run Code Online (Sandbox Code Playgroud)
按如下方式启动它:
systemctl --user start foo.socket
Run Code Online (Sandbox Code Playgroud)
一旦 FIFO 被写入,服务本身就会启动。如果您希望它立即启动,请像这样启动它:
systemctl --user start foo.service
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7860 次 |
| 最近记录: |