24

システムのシャットダウンを検出する必要があるアプリケーションに取り組んでいます。ただし、このイベントに関する信頼できる通知を受け取る方法は見つかりませんでした。

シャットダウン時に、アプリがSIGTERMシグナルを受信し、その後にSIGKILL. シャットダウン シーケンスの一部であるSIGTERMかどうかを照会する方法があるかどうか知りたいですか?

それをプログラムで照会する方法があるかどうかは誰にもわかりません(C API)?

私の知る限り、システムは差し迫ったシャットダウンを照会する他の方法を提供していません。もしそうなら、それは私の問題も解決するでしょう。私も試してみましたrunlevelsが、変更はrunlevels瞬時に行われるようで、事前の警告はありません。

4

9 に答える 9

11

多分少し遅れます。はい、ランレベルコマンドを呼び出すことで、SIGTERM がシャットダウン プロセスにあるかどうかを判断できます。例:

#!/bin/bash
trap "runlevel >$HOME/run-level; exit 1" term
read line
echo "Input: $line"

名前を付けて保存し、term.sh実行します。を実行すると、ホーム ディレクトリにkillall term.shあるファイルを確認して調査できるはずです。run-level次のいずれかを実行します。

sudo reboot
sudo halt -p
sudo shutdown -P

ファイルの違いを比較します。次に、それを行う方法についてのアイデアを持っている必要があります。

于 2013-11-27T02:38:29.893 に答える
6

SIGTERMがシャットダウン シーケンスの一部であるかどうかを判断する方法はありません。rc.dシャットダウン シーケンスを検出するには、 ereOn や Eric Sepanson などのスクリプトを使用するか、 DBus などのメカニズムを使用します。

ただし、設計の観点からSIGTERMは、シャットダウンの一部でなくても無視することは意味がありません。SIGTERMの主な目的は、アプリを正常に終了するよう丁寧に依頼することであり、十分な権限を持つユーザーがSIGTERMアプリを終了させたくない場合に を発行する可能性は低いです。

于 2010-05-20T05:14:43.117 に答える
6

男のシャットダウンから:

time 引数を使用すると、システムがダウンする 5 分前に/etc/nologinファイルが作成され、それ以上ログインできないようになります。

したがって、の存在をテストできます/etc/nologin。最適ではありませんが、おそらく最善の方法です。

于 2011-11-02T09:43:24.323 に答える
3

一部の SIGTERM シグナルに対して他のアプリケーションとは異なる応答をするアプリケーションを作成すると、不透明で混乱を招く可能性があります。与えられた信号に対して常に同じように応答する必要があることは議論の余地があります。異常な条件を追加すると、アプリケーションの動作の理解とテストが難しくなります。

(特別なシグナルを送信することによって) シャットダウンを処理する rc スクリプトを追加することは、このような問題を処理する完全に標準的な方法です。このスクリプトが標準パッケージ (make installまたは rpm/deb パッケージ) の一部としてインストールされている場合、ユーザー マシンの制御について心配する必要はありません。

于 2010-05-14T15:12:52.693 に答える
3

私はそれを手に入れたと思います。

ソース = https://github.com/mozilla-b2g/busybox/blob/master/miscutils/runlevel.c

参照が消えた場合に備えて、ここにコードの一部をコピーします。

#include "libbb.h"
...
struct utmp *ut;
char prev;

if (argv[1]) utmpname(argv[1]);

setutent();
while ((ut = getutent()) != NULL) {
    if (ut->ut_type == RUN_LVL) {
        prev = ut->ut_pid / 256;
        if (prev == 0) prev = 'N';
        printf("Runlevel: prev=%c current=%c\n", prev, ut->ut_pid % 256);
        endutent();
        return 0;
    }
}
puts("unknown");
于 2016-07-17T18:43:13.747 に答える
2

最初に望んでいたことを行うための実際的な答えは、シャットダウンプロセスを確認することです(例: ps aux | grep "shutdown -h" )。次に、コマンドライン引数と開始時刻を確認したい場合(たとえば、14:51 に開始された "shutdown -h +240" は、18:51 にシャットダウンされます)。

一般的なケースでは、システム全体の観点からこれを行う方法はありません。「シャットダウン」にはさまざまな方法があります。たとえば、シャットダウン時に悪い/危険な動作をしているプログラムをハードストップするために誰かがプラグを抜くことを決定したり、UPS が最初に SIGHUP を送信してから単に失敗したりする可能性があります。このようなシャットダウンは、システムのどこにも警告なしに突然発生する可能性があるため、SIGHUP 後に実行し続けても問題ないことを確認する方法はありません。

プロセスが SIGHUP を受信した場合、基本的には、より厄介なことがすぐに続くと想定する必要があります。何か特別なことをして、SIGHUP を部分的に無視したい場合は、a) シャットダウンを実行するプログラムと調整する必要があります。b) 他のシステムがシャットダウンを実行し、SIGHUP の直後にあなたを殺した場合に備える必要があります。ソフトウェアとデータは存続します。持っているデータをすべて書き出し、安全なアトミック更新を使用して追加専用ファイルにのみ書き込みを続けます。

あなたの場合、現在の解決策(すべてのSIGHUPをシャットダウンとして扱う)が正しい方法であるとほぼ確信しています。改善したい場合は、DBUSなどを介して通知する機能をシャットダウン プログラムに追加する必要があります。

于 2016-09-20T22:44:27.203 に答える
1

システムがシャットダウンすると、rc.dスクリプトが呼び出されます。

プログラムに特別な信号を送るスクリプトをそこに追加できるかもしれません。

ただし、その方法でシステムのシャットダウンを停止できるとは思えません。

于 2010-05-14T07:20:48.637 に答える