サービスの標準入力に書き込む方法

サービスの標準入力に書き込む方法

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つの質問があります。

  1. foo.service: Failed to set up standard input: No such file or directory StandardInput=以前にも存在していたようですExecStartPre=。インストール中に固定位置に永久パイプを作成する必要がありますか、それとも回避策はありますか?ファイルを手動で作成してExecStartPre削除することはExecStopPost問題ありません。
  2. 最初のものはecho "command"うまく処理されますが、1つは送信され、EOFstdinは閉じられます。標準入力を開いたままにしたい。 回答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

おすすめ記事