Ubuntuはシャットダウン時にSIGTERMを送信していません


21

Ubuntuは、実行中のアプリケーションに、正しく終了させるためにシャットダウンしていることを伝えているのではなく、強制的に終了させて​​いるのではないかと疑い始めています。

シャットダウン時にクロームを開いたままにすると、ブート後にもう一度開いたときに正しく閉じられなかったと表示され、LibreOfficeはドキュメントを保存するかどうかを尋ねず、コードを実行する必要があるアプリケーションを作成しています終了時に実行されますが、コンピュータがシャットダウンされている場合は実行できません。

私が理解したように、最初にすべてのプロセスにSIGTERMが送信され、プロセスが正常に終了できるようにします。終了しない場合は、SIGKILLが送信されて強制終了されます。UbuntuはSIGTERMをまったく送信していないか、SIGKILLを送信する前にアプリケーションに十分な時間を与えていないようです。

これを修正する方法はありますか?

Ubuntu 16.04を実行していますが、問題は15.10にも存在していました。15.10が最新バージョンであるときにUbuntuを使用し始めてから、それが以前にあったかどうかはわかりません。

編集:Unityを使用し、右上隅の歯車を押してシャットダウンを選択してコンピューターをシャットダウンしますsudo haltが、端末で実行している場合も問題は同じです。

編集:ログアウトするときだけ、同じ動作を観察しています。私の推測では、シグナルはログアウト時に送信されることになっているため、シャットダウンおよびログアウト時に問題が発生します。


どうやってシャットダウンしますか?
テルドン

1
クロムとLibreOfficeのは、SIGTERMにあなたがそれを処理することがしたい方法を処理していない
アンドレアCorbellini

2
私はあなたが何を意味するのか理解していない。SIGTERMを正しく処理していないということですか?たぶんそうではありませんが、質問で書いたように、私はSIGTERMを処理するプログラムに取り組んでいますが、そのコードは決して実行されていないようです。ctint + Cを押しながらSIGINTは完全に機能します。Ubuntuがシャットダウン時に実行中のプロセスに通知することに関して、いくつかの問題があると今でも信じています。
-GKraft


2
すべてのアプリケーションを手動で閉じる必要があり、最小化されたアプリケーションを忘れるとどうなりますか?作業を保存しません。そして、簡単に制御できない、または考えないバックグラウンドプロセスがたくさんあります。彼らは彼ら自身の後をきれいにするか、彼らがしていたことを保存する機会を与えられません。
-GKraft

回答:


3

残念ながら、この方法ではまったく機能しません。実際にシグナルハンドラを備えているプログラムの多くは、確認ダイアログを表示するためにシグナルをブロックしません。多くの場合、信号処理は最小限であるか、欠落しています。

シャットダウンせずに簡単に試すことができます。実行中のFirefoxまたはLibreOfficeプロセスにSIGTERMを送信するだけです。

$ pkill firefox

通常、Firefoxは本当に閉じるかどうかを尋ねる場合があります。また、特に長時間実行していて1 GBを超えるRAMを使用している場合は、通常、閉じるのに時間がかかります。最後のウィンドウが閉じられた後、プロセスが終了するのに1分程度かかることがよくあります。SIGTERMを送信してもこのようなことは発生せず、プロセスはただちに終了します。

ただし、一部のデスクトップ環境は、シャットダウンする前に開いているすべてのウィンドウを閉じます。SIGTERMとは異なり、プログラムでウィンドウを閉じることは、そのウィンドウのXボタン、またはAlt+をクリックするようなものF4です。これは、他の答えのスクリプトが行うことでもあります-wmctrlを使用して、開いているすべてのウィンドウを正常に閉じます。

ウィンドウが閉じられると、プログラムは急いでいないため、開いているタブなど、そのウィンドウ内のすべてを閉じることができ、保存されていない作業がある場合はダイアログウィンドウを表示することもできます。アプリケーションの開いているウィンドウがすべて閉じられると、通常、プロセスはその後すぐに終了します。

そのため、デスクトップ環境に依存します(デスクトップ環境を使用してシャットダウンするのではなく、シャットダウンすると仮定しますsudo poweroff)。たとえば、KDEは開いているウィンドウが閉じるのを待ってからシャットダウンしますが、MATEはシャットダウンしません。

結論:シャットダウンする前に、開いているすべてのウィンドウを手動で閉じます。または、すべてのウィンドウが閉じるのを待つデスクトップ環境を使用します。


シャットダウンプロセスと信号処理が思ったとおりに機能しなかったことがわかります。今、私はそれがどのように機能するはずであり、なぜ期待どおりに機能しなかったのかを理解しています。
GKraft

0

価値があることについては、先ほど、Manjaroフォーラムでこの手順を見つけました。

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

独自のスクリプトで呼び出して、シャットダウン(または再起動)の前に開いているすべてのアプリを閉じることができます。

唯一の問題は、Xfce用に作成されたため、Unity DEが課す変更が必要なことです。OPの問題を解決するために、より知識のある人からの少しの助けがここにうまく入ります。


数日間はコンピューターにアクセスできないため、修正しても試せません。そのようなスクリプトを使用することが本当に必要なのでしょうか?ubuntu shoukdはそれを単独で処理すると思います。
-GKraft

同意した。ただし、Xubuntuでは完全に機能します。たとえば、保存されていないドキュメントがある場合、シャットダウンは無期限に待機します。
-SR

0

実際、すべてのウィンドウを閉じ、特定のDEに依存しないスクリプトの一部は、Askで利用できます。2番目と3番目の回答は特に便利です。さらに数行追加するだけで、パネルまたはデスクトップにランチャーを作成することで、使用しているDEで機能する正常なシャットダウンを実現できます。

開いているすべてのウィンドウを適切に閉じる方法


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