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
program
gestoppt wurde, wird das gesamte Skript beendet. - Habe ein einfaches Python-Programm ausprobiert, das
stdin
die Daten liest und druckt. Ausgeführt in einem Sitzungsfenstertmux
. Habe versucht,stdout
aus 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 mussstdin
). Damit wollte ich sehen, ob das Schreiben der Daten in eine Datei +stdout
und das Lesen darausstdin
getrennt werden können, wenn überhaupt.
Antwort1
Wahrscheinlich nicht. Der Neustart des Standardeingabekonsumenten erfordert die Fähigkeit dieses Konsumenten, exec
sich 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 …)