web-dev-qa-db-ja.com

ArchLinuxでの正常なシャットダウン

GNOMEシェルを使用してArchLinuxで正常なシャットダウン/再起動を取得しようとしています。現在、シャットダウンを要求すると、開いているファイルを正常に閉じたり保存したりするために開いているプログラムに時間を与えることなく、すぐにシャットダウンします。その結果、Chrome(たとえば)を再起動するたびに、セッションが正しく閉じられなかったなどと表示されます。プロセスをシャットダウンしているときにsystemdが最初にa SIGTERMの後にSIGKILLが続き、指定されたタイムアウト時間内にプロセスが終了しない場合、システムでSIGKILLSIGTERMの直後に送信され、これが、プログラムが正常に終了しない原因であると思います。

私はいくつかの documentation を見つけました(これを正しく読んだ場合)は、SIGKILLを送信する前のタイムアウトはTimeoutStopSec=オプションで設定できると述べています。また、SIGKILLの送信は、SendSIGKILL=オプションによって無効にすることもできます。しかし、これらのオプションを設定する場所が見つかりません...これらのオプションを設定できるsystemdシャットダウン/再起動設定ファイルはありますか?

編集:

いくつかのテストを行ったところ、2つの興味深いことがわかりました。

  1. chromeこのようにkillall -SIGTERM chromeを手動で閉じると、次回起動したときにが正しく閉じられていないと文句が表示されません。代わりにこのように閉じるとkillall -SIGKILL chrome、それは文句を言うでしょうこれはchromeがSIGTERMを正しく処理していることを教えてくれます。
  2. シャットダウン手順の出力を見ると、systemdはSending SIGTERM...を出力し、直後にSending SIGKILL...を出力します

以下のコメントによると、systemdはそのプロセスのみを処理しています。私の場合はGDMです。これにより、問題は次のようになる可能性があることがわかります。

  1. gDMが子プロセス(Chromeなど)を正しく閉じていない(SIGTERMをそれらに送信するなど)
  2. またはsystemdがGDMにSIGKILLメッセージを早期に送信して、子を正しく閉じる時間を与えていません。

GDMが実際に子を閉じる方法を確認/構成する方法はありますか?

21
lviggiani

これは、Gnome 3.12を搭載したArch Linuxで私に役立ちました。おそらく/etc/gdm/PostSession/Defaultの設定に関連していることがわかりました。

  1. Sudo pacman -S wmctrlを実行して、Windows管理用のwmctrlをインストールします。

  2. すべてのウィンドウを閉じるための実行可能ファイルを作成します。たとえば、次の内容で/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
    
  3. /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
    

これらが機能することを願っています。

2
sorpaas

デスクトップを正常にシャットダウンするには、TimeoutStopSec= GDM、または使用している他のディスプレイマネージャ。

2
CameronNemo