重新啟動在背景運行的程式並仍然使其從標準輸入消耗

重新啟動在背景運行的程式並仍然使其從標準輸入消耗

這是我之前問過的問題的延伸這裡

{
 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 消費者隨機不可用,或者能夠或多或少優雅地重新啟動所述消費者。

(請注意,對於緩衝讀取,消費者可能需要付出額外的努力來處理或以某種方式傳遞緩衝讀取讀取的任何不完整數據,但在重新啟動或退出時尚未處理..... .)

相關內容