Starten Sie das im Hintergrund laufende Programm neu und lassen Sie es trotzdem von der Standardeingabe verwenden.

Starten Sie das im Hintergrund laufende Programm neu und lassen Sie es trotzdem von der Standardeingabe verwenden.

Dies ist eine Erweiterung der vorherigen Frage, die ich gestellt hatteHier

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

Ich habe das Skript erfolgreich für meinen Zweck verwendet (es ist möglicherweise nicht korrekt gemäß den Programmierprinzipien).

Ich führe das Skript wie folgt aus

./script.sh &

Frage

Gibt es eine Möglichkeit, nur den Java-Programmteil der oben beschriebenen Einrichtung neu zu starten?

Versuche

  • Sobald es programgestoppt wurde, wird das gesamte Skript beendet.
  • Habe ein einfaches Python-Programm ausprobiert, das stdindie Daten liest und druckt. Ausgeführt in einem Sitzungsfenster tmux. Habe versucht, stdoutaus einem anderen Fenster in der Sitzung in der gleichen Host-Eingabeaufforderung zu schreiben, was nicht funktioniert hat (was beweist, dass ich mehr darüber lesen muss stdin). Damit wollte ich sehen, ob das Schreiben der Daten in eine Datei + stdoutund das Lesen daraus stdingetrennt werden können, wenn überhaupt.

Antwort1

Wahrscheinlich nicht. Der Neustart des Standardeingabekonsumenten erfordert die Fähigkeit dieses Konsumenten, execsich selbst neu zu starten.

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

Wenn es ausgeführt wird, wird es alle vier Zeilen neu gestartet:

$ 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...
$ 

Ich lehne mich mal aus dem Fenster und vermute, dass eine Steckdose oderNachrichtenwarteschlangekönnte besser der Notwendigkeit entsprechen, den Verbraucher der Ausgabe zufällig zu beenden und neu zu starten, da dann die Nachrichten (bis zu einem Pufferlimit oder bei Blockierung ...) bestehen bleiben würden, während der Verbraucherprozess beendet und neu gestartet wird. Oder Sie könnten einen Proxy irgendeiner Art schreiben, der die Standardeingabe liest und toleriert, wenn der nachfolgende Java-Verbraucher zufällig nicht verfügbar ist, oder der in der Lage ist, den besagten Verbraucher mehr oder weniger elegant neu zu starten.

(Beachten Sie, dass der Verbraucher bei gepufferten Lesevorgängen möglicherweise zusätzliche Anstrengungen unternehmen muss, um die unvollständigen Daten, die beim gepufferten Lesevorgang gelesen wurden, aber beim Neustart oder Beenden nicht behandelt wurden, zu verarbeiten oder irgendwie weiterzuleiten …)

verwandte Informationen