以前に質問した内容の延長です。ここ
{
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
。同じホストコマンドプロンプトのセッション内の他のウィンドウで書き込みを試みましたが、うまくいきません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消費者のランダムな使用不可を許可したり、その消費者をある程度正常に再起動したりできるエージェントの種類を作成することもできます。
(バッファリングされた読み取りの場合、消費者はバッファリングされた読み取りから読み取ったが再起動またはシャットダウンしたときにまだ処理されていない不完全なデータを処理または何らかの方法で転送するために追加の努力が必要になる場合があります。