2

Linux C++ サービスを作成しました (基本的にはアプリですが、TCP/IP 経由のリクエストを頻繁に処理します)。

何か問題が発生した場合(クラッシュなど)、またはサーバーが再起動した場合に「自動再起動」する簡単な方法があるかどうか疑問に思っていましたか?

サービスとして設定するか、rc.dスクリプトを設定する必要があるかどうか、またはその方法がわかりませんでした。Linuxでこれを行う方法に100%精通しているわけではありません(問題がある場合、サーバーはubuntuを実行しています)。

どんなアドバイスでも大歓迎です!

〜ジョシュ

4

5 に答える 5

4

ここでの多くの回答は、それを行う「親アプリ」を持つことを示唆していますが、親アプリで同じ問題が発生します-それはずっとカメです.

多くの UNIX タイプのシステム (特に歴史的に) では、init プロセスは最初に実行されるプロセスであり、/etc/inittab で定義されているプロセスを実行 (および自動的に再起動) します。

したがって、自動再起動する独自のウォッチドッグまたはプロセスを作成する代わりに、自動的にジョブを実行するこのプロセスを使用できます。これは init プロセスであるため、プロセスが停止した場合、システムはサービスよりも多くのことを心配する必要があります。 .

サービスが着信接続ごとに新しいプロセスを生成する必要があり、着信接続がある場合にのみ機能する場合、@doron は別の良いアプローチを提案します。

最後に、最近、init プロセス (および /etc/inittab) が Ubuntu タイプのシステムで upstart ( http://upstart.ubuntu.com/ ) に置き換えられました。これは、同じことのためのより柔軟なシステムです。

于 2012-11-16T03:36:07.397 に答える
4

私の製品では、フォークと実行サービス プロセスを別のプロセスで実行し、その終了を待つウォッチドッグ プロセスを作成しました。何らかの理由でプロセスが終了した場合、ウォッチドッグ プロセスは別のスレッドを作成し、プロセスを再開します。

コメントに記載されているように、クラッシュした理由を確認する必要があります。まず、プログラムの終了値を読み取ることができます。

以下は、開始するための簡単なプログラムです。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    create_process();
    return 0;
}

void create_process()
{
    int exit_code;
    if(fork() == 0)
    {
        exec("./your_service");
    }
    else
    {
        wait(&exit_code);
        if(WIFEXITED(exit_code))
        {
            /* Program terminated with exit */
            /* If you want, you could decode exit code here using
               WEXITSTATUS and you can start program again.
            */
            return;
        }
        else
`       {
                /* Program didn't terminated with exit, restart */
            create_process();
        }

    }
}

システムの起動時にサービスを開始するには、/etc/rc.localスクリプトを編集し、ウォッチドッグ プロセスを実行するためのコマンドを追加するだけです。

于 2012-08-03T13:46:50.310 に答える
3
  • 必要に応じて起動および再起動する制御アプリを作成します。
  • アプリでこれを行います-子をフォークし、そこでプログラムを実行し、停止/クラッシュをキャッチし、必要に応じて新しい子をフォークします。いくつかの実用的なコードはここにあります: c でメイン アプリを監視します
于 2012-08-03T13:46:13.337 に答える
0

*NIX で子プロセスを自動再起動する親アプリを作成する最も簡単な方法は、シェル スクリプトを使用することです。

#!/bin/sh
while true;
do
    run_my_program;
done

必要に応じて、このリダイレクト出力を使用したり、バックグラウンドで実行したりできます。これは、そもそもプロセスの開始に対処するものではありませんが、C++ で親プロセスを作成するよりも (まったく同じ結果を得るために) 作業が少なくて済みます。

于 2012-08-03T15:00:27.263 に答える