私はmanqge HLTVサーバー用の小さなsystemctlサービスを作成しました(ゲーム内のデモを記録してディスクに保存します)。
[Unit]
Description=HLTV server
Requires=cs16.service
After=cs16.service
[Service]
Type=simple
User=cs16
Group=cs16
UMask=007
ExecStart=/home/cs16/server/hltv_start.sh
Restart=on-failure
# Configures the time to wait before service is stopped forcefully.
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
うまくいきますが、システムサービスをシャットダウン/再起動すると、プロセスが終了し、現在作成中のデモが破損します。
デモを正しく保存するには、htlvコマンドツールに「quit」または「stop」と入力する必要があります。 systemctlにプログラムを閉じる前にコマンドの1つをプログラムに送信させる方法はありますか?
答え1
デフォルトでは、プロセスの場合、systemctl stop
systemdはSIGTERMをプロセスに送信します。プロセスは信号を処理し、正常に終了する役割を担います。プロセスが90秒以内に終了しない場合、SIGKILLはプロセスを強制停止します。
このデフォルトの動作を変更する方法はいくつかあります。
ExecStop=
:プロセスが通常ソケット、共有メモリ、タッチファイルの外部信号を介して終了する場合を使用して、その信号をプロセスに送信するスクリプトを実行できますExecStop=
。KillSignal=
:プロセスがSIGTERMに正しく応答しない場合は、プロセスに送信された信号変更を使用できますKillSignal=
。プロセスはSIGINT、SIGABRT、またはSIGQUITにうまく応答できます。この信号は、プログラムが実行する保存を開始する必要があることに注意してください。TimeoutStopSec=
、デフォルトは90秒で、最初との間KillSignal
の時間を提供しますFinalKillSignal
。 300秒に増やしましたね。通常、保存に時間がかかる場合は時間を長くしてください。これが保存に対する期待を超えると、プロセスは現在応答しなくなる可能性がありますKillSignal=
。SendSIGKILL=
:プロセスが保存を開始したが無期限に待機したい場合は、no
サービスが永久に中断されるように設定できます。 (まずプレイしてくださいTimeoutStopSet
)。FinalKillSignal=
TimeoutStopSet
: killsignal が正しく動作せず、他のアクションを実行したい場合は、SIGKILL
ここでコードを設定できます。
プロセスをサービスとして実行していない場合は、通常プロセスを停止する方法を考えてみてください。その後、訴訟に従ってください。CTRL+D
端末で使用していますか?kill
プロセスがありますか?
プロセスがで始まるので、したいかもExecStart=/home/cs16/server/hltv_start.sh
しれませんExecStop=/home/cs16/server/hltv_stop.sh
。
デモを正しく保存するには、htlvコマンドツールに「quit」または「stop」と入力する必要があります。
このコマンドツールはコマンドラインアプリケーションですか?その場合は、次のものが必要な場合があります。
ExecStop=/home/cs16/server/hltv_command_tool.sh -c stop
このツールがHLTV GUIの一部である場合は、quit
ウィンドウマネージャを介して送信するか、テキストメッセージを送信できます。stop
次のコマンドは、bash
シェルを実行してからタイトルにinを含むウィンドウをxdotool
検索するために使用されます。hltv
次に対応するquit
ウィンドウに入力し、[次へ]をクリックしますEnter
。
ExecStop=/bin/bash -c 'xdotool type --window "$(xdotool search hltv | head -1)" quit && xdotool key --window "$(xdotool search hltv | head -1)" Enter'
答え2
それはサービスにならないでください
タスクに重大なダメージを与えずに終了できないタスクは、「サービス」として実行しないでください。タスク固有のスクリプトまたはプロセスとして実行する必要があります。
あなたがしようとしていることは、インターネットがsystemctl stop apache2
サイト自体を完了する前にサイトへの要求を停止するのを待つことです。
ローカルシステムの場合、システムをシャットダウンする必要がある場合はファイルの書き込みを続行できません。あなたがこれをすることにした場合、考える systemctl
サービスが終了するのを待つ必要はありません。
たぶん、サービスがシャットダウンを待つ別のスクリプトを実行する必要があるかもしれません。
ソリューションは製品ロードマップにあります。つまり、開発者に製品管理者に、どのユーザーエクスペリエンスが不可能で、どのエクスペリエンスを経験する必要があるかを伝えるように指示することです。
hltv_start.sh
この質問には、次の提案で答えていますが、スクリプトを共有していないため、スクリプトの内容がわかりません。したがって、それが問題の核となるべきではありません。だから私はこれらのブレーンストーミングを超えて具体的に言うことはできません...
考慮する:
- レンダリング後、システムをシャットダウンするオプションと同様のスクリプト方法を使用して、GUIでKdenlive機能を実装します。スクリプトを調整してファイルの書き込みを開始し、次のようにしてサービスを自動的に終了できます。
systemctl stop
後ろに文書の作成が完了しました。 wait
終了する前に、書き込みプロセスが完了するようにジョブごとにファイルを書き込むスクリプトを作成します。systemctl
パワームーブでプロセスを終了するには、別のスクリプトを作成してください。しなければならない中間ファイルの処理を停止します。- サービスを含める必要がある場合は、実際に作成するのではなく「リスニング」または必要に応じて終了
wait
スクリプトを呼び出すサービスを使用してください。 - サービスが単に「受信」してからファイルに書き込む別のスクリプトを実行している場合は、理論的には書き込み操作が完了することを許可しながらサービスを提供
wait
できます。これがあなたの目標であると仮定します。systemctl stop