私は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'