バックグラウンドで実行中のプログラムを再起動し、stdin から引き続き使用する

バックグラウンドで実行中のプログラムを再起動し、stdin から引き続き使用する

これは私が以前に尋ねた質問の延長ですここ

{
 python2 readLines.py &
 python2 readLines.py &
 python2 readLines.py &
 python2 readLines.py &
 python2 readLines.py &
} | tee  output_file | java program 

私はスクリプトをうまく使用して目的を達成してきました(プログラミングの原則に従っていない可能性があります)。

次のようにスクリプトを実行しています

./script.sh &

質問

上記のセットアップの Java プログラム部分だけを再起動する方法はありますか?

試み

  • が停止するとすぐにprogram、スクリプト全体がダウンします。
  • Python で簡単なプログラムを実行して、stdinデータの読み取りと印刷を試しました。tmuxセッションの 1 つのウィンドウで実行しました。stdout同じホスト コマンド プロンプトのセッションで別のウィンドウから書き込みを試みましたが、うまくいきませんでした (stdinこのことについてさらに詳しく調べる必要があることが証明されました)。これは、ファイルへのデータの書き込みstdoutと読み取りをstdin分離できるかどうかを確認するためのものでした。

答え1

おそらくそうではありません。標準入力コンシューマーを再起動するには、そのコンシューマー自体の機能が必要ですexec

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char buf[1];
    int ret;
    int linenumber = 0;
    fprintf(stderr, "collect me some input...\n");
    while (1) {
        ret = read(STDIN_FILENO, buf, 1);       // unbuffered. inefficient
        if (ret == 0)           // EOF
            exit(EXIT_SUCCESS);
        else if (ret < 0)
            err(1, "read failed");

        write(STDOUT_FILENO, buf, 1);

        if (buf[0] == '\n') {
            linenumber++;
            if (linenumber == 4) {      // restart ourself every four lines...
                execvp(*argv, argv);
                err(1, "exec failed");
            }
        }
    }
    exit(EXIT_SUCCESS);
}

実行すると、4 行ごとに再起動します。

$ make execself
cc     execself.c   -o execself
$ perl -E 'say "line $_" for 1..8' | ./execself
collect me some input...
line 1
line 2
line 3
line 4
collect me some input...
line 5
line 6
line 7
line 8
collect me some input...
$ 

私はあえて推測しますが、ソケットかメッセージキュー出力のコンシューマーをランダムに終了して再起動する必要がある場合は、この方法の方が適しているかもしれません。そうすれば、コンシューマー プロセスが終了して再起動されている間も、メッセージは (バッファー制限まで、またはブロッキング付きで) そのまま残ります。または、標準入力を読み取り、後続の Java コンシューマーがランダムに利用できなくなることを許容するプロキシを作成したり、そのコンシューマーを多かれ少なかれ正常に再起動できるようにしたりすることもできます。

(バッファ読み取りの場合、バッファ読み取りによって読み取られたが、再起動時または終了時に処理されていない不完全なデータを処理したり、何らかの方法で渡したりするために、消費者が追加の手間をかける必要がある場合があることに注意してください...)

関連情報