GNOMEシェルを使用してArchLinuxで正常なシャットダウン/再起動を取得しようとしています。現在、シャットダウンを要求すると、開いているファイルを正常に閉じたり保存したりするために開いているプログラムに時間を与えることなく、すぐにシャットダウンします。その結果、Chrome(たとえば)を再起動するたびに、セッションが正しく閉じられなかったなどと表示されます。プロセスをシャットダウンしているときにsystemdが最初にa SIGTERM
の後にSIGKILL
が続き、指定されたタイムアウト時間内にプロセスが終了しない場合、システムでSIGKILL
がSIGTERM
の直後に送信され、これが、プログラムが正常に終了しない原因であると思います。
私はいくつかの documentation を見つけました(これを正しく読んだ場合)は、SIGKILL
を送信する前のタイムアウトはTimeoutStopSec=
オプションで設定できると述べています。また、SIGKILL
の送信は、SendSIGKILL=
オプションによって無効にすることもできます。しかし、これらのオプションを設定する場所が見つかりません...これらのオプションを設定できるsystemdシャットダウン/再起動設定ファイルはありますか?
編集:
いくつかのテストを行ったところ、2つの興味深いことがわかりました。
killall -SIGTERM chrome
を手動で閉じると、次回起動したときにが正しく閉じられていないと文句が表示されません。代わりにこのように閉じるとkillall -SIGKILL chrome
、それは文句を言うでしょうこれはchromeがSIGTERMを正しく処理していることを教えてくれます。Sending SIGTERM...
を出力し、直後にSending SIGKILL...
を出力します以下のコメントによると、systemdはそのプロセスのみを処理しています。私の場合はGDMです。これにより、問題は次のようになる可能性があることがわかります。
GDMが実際に子を閉じる方法を確認/構成する方法はありますか?
これは、Gnome 3.12を搭載したArch Linuxで私に役立ちました。おそらく/etc/gdm/PostSession/Default
の設定に関連していることがわかりました。
Sudo pacman -S wmctrl
を実行して、Windows管理用のwmctrlをインストールします。
すべてのウィンドウを閉じるための実行可能ファイルを作成します。たとえば、次の内容で/home/[your_username]/bin/close-all-windows
に入れます。
#!/bin/sh
wmctrl -l | while read -r line
do
wmctrl -c `echo "$line" | sed 's/.* [0-9]* [your_hostname] //'`
done
/etc/gdm/PostSession/Default
を変更し、exit 0
の前に次のコンテンツを追加します。
echo " Closing selected windows programs gracefully"
export DISPLAY=:0
su [your_username] -c /home/[your_username]/bin/close-all-windows
これらが機能することを願っています。
デスクトップを正常にシャットダウンするには、TimeoutStopSec=
GDM、または使用している他のディスプレイマネージャ。