Fedora 17 では、シャットダウン操作 (例: シャットダウン -h now) が非常に高速化されている (最大 2 秒程度) ことに気付きました。実行中のプロセスが適切に終了されているかどうか疑問に思っています。特に Fedora では (これも約 2 秒)、すべてのプロセスが完了するのに十分な時間があるとは考えられません。
シャットダウン コマンドが発行される前に、すべてのユーザー プロセスがユーザーによって (手動で) 閉じられていると想定しているため、システム サービスのみが残っています (それでも、終了時に実行する処理がある可能性があります)。
そこで、ほとんどのシグナルをキャッチし、数値 (秒数) が指定されている場合は終了する前に待機する小さなプログラムを作成しました。それ以外は何もしません。次に、まず Debian システムで 60 秒の遅延で開始しました。SIGHUP を受信すると (親シェルが終了したと想定)、60 秒のカウントダウンが開始されました。10 秒後、フレンドリーな SIGTERM を受信しました。私のプログラムはこのシグナルを無視し、カウントダウンを続行しましたが、40 秒目で悲劇的に終了しました。そのため、終了するように指示されてから (SIGHUP) 20 秒後に、SIGKILL されました。
次に、Fedora 17 (3.5.3-1.fc17.x86_64) で同じテストを実行します。
シグナル 1 をキャッチしました。
実行時間: 8 秒
終了を 60 秒間遅延しています...
60...
シグナル 15 をキャッチしました - 無視します!
59...
58...
SIGHUP から 1 秒も経たないうちに、SIGTERM を受信します。プログラマーは、ジョブを終了したり、設定を保存したりするために、SIGTERM の後にプログラムの終了を遅らせることがあります (SIGINT の後とは違います)。私のプログラムは、終了するまでに 2 秒かかります。
何らかの設定を保存中に実行中のプロセスが強制終了された場合 (設定ファイルが破損している?)、または何らかのデーモン (たとえば、何らかのファイル サーバー) がキャッシュされたデータをディスクに書き込んでいる場合 (データが破損している?) はどうなりますか?
答え1
サービスは、ファイル内で終了方法を指定できます*.service
。任意のタイムアウトを選択できます。デフォルトのままにする必要はありません。 postgreSQL または mysqld がインストールされている場合は、サービス ファイルを参照して、クリーンなシャットダウンがどのように行われるかを確認してください。