私がサービスファイルを作成しているアプリケーションはにSTDIN
接続されると予想していますtty
。つまり、端末で実行されると予想されます。Systemd
次の設定を使用すると、私のアプリケーションの問題は解決されますが、ここでは他のアプリケーションですでに使用されているか、tty
システムにまったく存在しない可能性がある静的に設定されたパスを使用しています。
StandardInput=tty-force
TTYPath=/dev/tty30
systemd
(または私が)使用していないペアリングを特定してpseudoterminal
代わりに使用できる場合は、より良いでしょう。
答え1
によるとman systemd.exec
。お探しの機能がに組み込まれていませんsystemd
。
systemd
あるいは、無料のTTYを見つけて、ハードコーディングされたTTYでユニットファイルを作成し、systemctl start
インスタントユニットファイルを呼び出す別の小規模サービスを作成することもできます。
答え2
私はsystemdにまったく依存せずに一般的なscript
コマンドを使用する解決策を見つけました。たとえば、
ExecStart=/usr/bin/script -e -c "/usr/bin/python3 -m http.server" /dev/null
python3
割り当てられた擬似端末を使用して実行されますscript
。コピーしたファイルは で削除されます/dev/null
。
以前のバージョンはscript
信号を正しく処理できないようであるため、KillSignal=SIGKILL
同様のパッチワークが必要になる場合があります。 (2.37.2はこれがscript
なくても動作しますutil-linux
。)
からman script
:
-c, --command command
Run the command rather than an interactive shell. This makes it
easy for a script to capture the output of a program that behaves
differently when its stdout is not a tty.