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


21

GNOME Shellを使用してArchLinuxで正常なシャットダウン/再起動を試みています。現在、シャットダウンを要求すると、開いているファイルを正常に閉じたり保存したりする時間を開いているプログラムに与えることなく、すぐにシャットダウンします。私は、(例えば)Chromeを再起動するたびにその結果、それがプロセスをシャットダウンし、それが最初に送っている間、私はそれにsystemdを学んウェブ上で読み取ることによりなどのセッションが正しく閉じられていなかったことを私に告げるSIGTERMが続くSIGKILLプロセスが閉じない場合所定のタイムアウトで。しかし、SIGKILLすぐに私のシステム上で送信されることに気づき、SIGTERMこれがプログラムが正常に終了しない原因だと思います。

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

編集:

私はいくつかのテストを行い、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が実際にその子を閉じる方法を確認/構成する方法はありますか?


1
Systemdは、その制御下で直接プロセスにのみシグナルを送ります。クロムのようなものは、それらのプロセスの1つではありません。Systemdはディスプレイマネージャー(xdm、gdm、kdmなど)に信号を送ります。その後、ディスプレイマネージャーがその子に信号を送り、クロムに到達するまで続きます。chromeにシグナルを送信しない場合、xorgサーバーがシャットダウンされて表示が消えると、chromeは死にます。
パトリック14

@パトリック:ありがとう、そう思いました。これが、freedesktop.org / software / systemd / man / systemd.serviceに従って、「/etc/systemd/system/display-manager.service」の「[Service]」セクションに「TimeoutStopSec = 90s」を追加しようとした理由です。 htmlが何も変わりません... :(
lviggiani 14

Chrome systemd's制御下にある必要があります- systemdですpid 1-しかし、Chromeはサブシェルのラッパースクリプトを実行し、その後子プロセスを呼び出します。それでも、zygotesシステムが適切に構成されている限り、強制終了するのに必要なことは行います。Arch wikiで推奨されているChromeの一時スペースソリューションの1つを使用していますか?
mikeserv 14

1
Arch上のKDEとFirefoxで同様の問題が発生します。理由を理解しようとすることは一度もありません。
StrongBad 14

2
GDMはプロセスを通知していません。GDMは、本質的にXorgとPAMを接続するための愚かな方法です。本当の犯人はgnome-session
strugee

回答:


2

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


GDMは、すべてのクライアントを閉じることができるかどうかわからなかった場合、最初にsystemdにシャットダウンするように指示するべきではなかったようです。
enigmaticPhysicist

2

これは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
    

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


Plasma 5では、このスクリプトを.config / plasma-workspace / shutdown /に置くと問題が解決します
AF7

-1

sorpassのwmctrlスクリプトはうまく機能します(CentOS 7では、最初に 'yum install wmctrl'を実行する必要がありました)。しかし、/ etc / gdm / PostSession / Defaultはシャットダウン時にではなく、ログアウト時にのみ実行されるように見えました。したがって、/ etc / gdm / PostSession / Defaultを使用する代わりに、次の2つのサイトにあるSeamus Phelanのpythonスクリプトからsorpassのwmctrlスクリプトを呼び出します。

このスクリプトの組み合わせは、CentOS 7デスクトップマシンをログアウトまたはシャットダウンしたときに、Firefox、Chromeなどを自動的かつクリーンに閉じるのに最適です。CentOS 7では、このPythonスクリプトが機能するために「yum install gnome-python2-gnome」を実行する必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.