重新启动在后台运行的程序并仍然使其从标准输入消耗

重新启动在后台运行的程序并仍然使其从标准输入消耗

这是我之前问过的问题的延伸这里

{
 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);
}

运行时每四行重新启动一次:

$ 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 消费者随机不可用,或者能够或多或少优雅地重新启动所述消费者。

(请注意,对于缓冲读取,消费者可能需要付出额外的努力来处理或以某种方式传递缓冲读取读取的任何不完整数据,但在重新启动或退出时尚未处理......)

相关内容