Terminus SSH端末を使用して接続できるサーバーをリースします。入力を要求して受け入れ、通常の起動時に期待どおりに機能するプログラムを作成しました。ただし、起動時またはクラッシュ時に自動的に開始するサービスを作成しましたが、そのサービスから起動すると、端末に出力が印刷されないか、入力が許可されません。
ユニットファイルでStandardinputとStandardoutputを空白のままにし、systemctl statusコマンドを使用すると、プログラムの起動時に印刷する必要があるプロンプトを表示できますが、まだコマンドを発行することはできません。
私はStandardinputとStandardoutputをttyに、tty-forceに設定し、TTYPathを/dev/pts/0に設定してみました。なぜならそれが私が使っているttyだからです。これを行うと、まだ出力が提供されていないか、入力が許可されず、systemctl statusコマンドを使用しても起動出力も提供されません。 /dev/console を TTYPath として使用する場合も同様です。デフォルト値でなければならないと読みました。したがって、標準入力または出力が設定されていない場合は、systemd状態でこれらのプロンプトが表示されますが、/dev/console(デフォルトの場合)に設定されている場合は表示されない理由がわかりません。
また、ptyp0、ptyp1、tty0、tty2、stdin / stdoutなどの他のいくつかのttyも試しましたが、まだ機能しませんでした。どんな提案がありますか?
SSH端末に接続していないときに接続しようとすると、問題が発生する可能性があることがわかります。この場合、開いている仮想端末を設定して入力に使用できる方法はありますか?出力、それではSSH経由でログインするたびにその端末に接続しますか?
仮想端末を作成してSSH経由で接続するにはどうすればよいですか? chvt 0とchvt 1を試しましたが、「コンソールを参照するファイル記述子を取得できませんでした」というメッセージが表示され、sudo suも試みましたが、まだ同じ応答を受け取りました。
ユニットコードです
Description= Makes sure server stays running
[Service]
Type=simple
TTYPath=/dev/pts/0
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/lib/jvm/jdk-19/bin/java -cp /apps/server/lib/*:/apps/server/src packages/Server
Restart=always
RestartSec= 30
[Install]
WantedBy=default.target```
答え1
screen
この目的に使用できます。たとえば、~/noisy.sh
実行可能に作成された単純なスクリプト()を考えてみましょうchmod a+x ~/noisy.sh
。あなたの場合、これは長い間実行されている複雑なアプリケーションになります。
#!/bin/sh
while :
do
date
sleep 5
done
screen
以下のように長期実行セッションに延期できます。
screen -S myNoisy -md ~/noisy.sh
これにより、どのセッションが長期実行アプリケーションであるかを-S <session_name>
識別できます。例ではこれを使用しましたscreen
。myNoisy
通常どおりにを使用してセッションを一覧表示し、を使用してscreen ls
このセッションに接続してから、をscreen -r myNoisy
使用して再び分離できますCtrl Ad。
コードを自動的に再起動するには、代替例として提供されているものと同じスクリプトを使用しますが、間に1行を挿入してdate
実際sleep 5
のコードを呼び出します。またはscreen
で実行されているアプリケーションsystemd
。