これは私が以前に尋ねた質問の延長ですここ
{
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 コンシューマーがランダムに利用できなくなることを許容するプロキシを作成したり、そのコンシューマーを多かれ少なかれ正常に再起動できるようにしたりすることもできます。
(バッファ読み取りの場合、バッファ読み取りによって読み取られたが、再起動時または終了時に処理されていない不完全なデータを処理したり、何らかの方法で渡したりするために、消費者が追加の手間をかける必要がある場合があることに注意してください...)