サービスは同期的に停止しますか、それとも非同期的に停止しますか?

サービスは同期的に停止しますか、それとも非同期的に停止しますか?

私は以前SSHを介してリモートでシステムをシャットダウンしたことがありますが、同期されていsudo service ... stopなかったので、stopUbuntuシステムをすぐにシャットダウンしたかどうか疑問に思いました。

それでは、私の恐怖は間違った予感に基づいていますか?

編集:私のサービスは、ポートからリスニングコンテンツを受信し、頻繁にデータベースにコンテンツを書き込むプライベートサービスです。サービスが突然中断されると、更新する時間がないかどうか心配されます。stop空にすることを担当していますが、考えてみると時間がかかるかもしれません…

答え1

アプリケーションを確認してください

  1. システムログに適切なシャットダウンを記録します。man 3 syslog詳しくはこちらをご覧ください。
  2. データベースに必要なすべてを書き、接続を閉じ、詳細についてはexitingを介してSIGTERMを処理します。man 2 sigaction
  3. /etc/init.dにジョブ停止ハンドラがありますman initman stopping

これにより、アプリケーションが正しく停止されていることを推測することなく、ただ知ることができます。

答え2

サービスがどのように停止したかによって異なります。あなただけが知っています。サービスの開始と停止の方法は、サービスユーザーのために文書化して提供することをお勧めします。

killシェルスクリプト呼び出しでシグナルを送信してサービスが停止した場合、これは非同期です。コマンドkillまたはシステムコールはプロセスにシグナルを送信し、すぐに返されます。プロセスが信号を十分に処理したことを知らせるために再度呼び出すメカニズムはありません。したがって、完了したことを示す別の方法を見つける必要があります。

サービスからファイルを作成または削除し、制御スクリプトでそのファイルの変更を監視するなど、さまざまなアプローチが可能です。しかし、彼らはしばしば厄介です。サービスの完了時にフィードバックが必要な場合は、無関係なプロセスに信号を送信するのは良いアプローチではありません。

Upstart サービスの説明の指示に従ってサービスが停止すると、stopUpstart はプロセスにシグナルを送信します。その後、Upstartsはプロセスが停止するまで数秒待ちます。 Upstartはプロセスの親プロセスなので、プロセスが終了するとカーネルから通知(SIGCLD信号)を受け取ります。この方法は、プロセスがバックグラウンドに切り替えられない場合にのみ機能します。 Upstartサービスの説明は、通常フォークしないように指示するオプションを使用してデーモンを呼び出します(例ssh -D:)。

高度なサービスには制限コマンドがあります。制限コマンドを呼び出すと、新しい接続の受け入れが停止します。保留中のすべての接続が閉じられると、サービスは制限コマンドに肯定的な応答を送信してから終了します。通信方法は通常UnixまたはIPソケットです。

関連情報