
stdinに接続されているCLIを持つサービスを実行しています。私はssh
マシンに入ったときにサービスの標準入力にコマンドを送信できるようにしたいです。
システムランチャー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
この例では、次のコマンドを実行すると、ログに出力が表示されることが予想されます。
echo "hello" > /run/user/1000/foo.stdin
これには2つの質問があります。
foo.service: Failed to set up standard input: No such file or directory
。StandardInput=
以前にも存在していたようですExecStartPre=
。インストール中に固定位置に永久パイプを作成する必要がありますか、それとも回避策はありますか?ファイルを手動で作成してExecStartPre
削除することはExecStopPost
問題ありません。- 最初のものは
echo "command"
うまく処理されますが、1つは送信され、EOF
stdinは閉じられます。標準入力を開いたままにしたい。 回答(exec 3> stdin
、...、exec 3>&-
)はbash FDリダイレクトを使用しているようですが、systemdでは使用できません。
答え1
あなたは作ることができますソケットユニットFIFOの場合:
foo.socket
:[Socket] ListenFIFO=%t/foo.stdin Service=foo.service
foo.service
:[Service] ExecStart=/bin/cat - Sockets=foo.socket StandardInput=socket StandardOutput=journal StandardError=journal
次のように起動します。
systemctl --user start foo.socket
FIFOが作成されると、サービス自体が起動します。すぐに開始するには、次のように開始します。
systemctl --user start foo.service