Hintergrund:
Ich schreibe ein Testskript für eine Computational Biology-Software. Die Ausführung der Software, die ich teste, kann Tage oder sogar Wochen dauern, sodass bei Systemabstürzen oder Stromausfällen eine Wiederherstellungsfunktion integriert ist.
Ich versuche herauszufinden, wie das Wiederherstellungssystem getestet werden kann. Insbesondere kann ich keine Möglichkeit finden, das Programm auf kontrollierte Weise "zum Absturz zu bringen". Ich dachte daran, eine SIGKILL-Anweisung so zu planen, dass sie nach einiger Zeit ausgeführt wird. Dies ist wahrscheinlich nicht ideal, da nicht garantiert wird, dass der Testfall jedes Mal dieselbe Geschwindigkeit ausführt (er wird in einer gemeinsam genutzten Umgebung ausgeführt), sodass ein Vergleich der Protokolle mit der gewünschten Ausgabe schwierig wäre.
Diese Software druckt für jeden abgeschlossenen Analyseabschnitt eine Zeile.
Frage:
Ich habe mich gefragt, ob es eine gute / elegante Möglichkeit (in einem Shell-Skript) gibt, die Ausgabe eines Programms zu erfassen und das Programm dann zu beenden, wenn eine bestimmte Zeile / Anzahl von Zeilen vom Programm ausgegeben wird.
Antworten:
Ein Wrapper-Skript wie dieses ist ein Standardansatz. Das Skript führt das Programm im Hintergrund aus und wiederholt dann die Protokolldatei jede Minute auf Zeichenfolgen. Wenn die Zeichenfolge gefunden wird, wird das Hintergrundprogramm beendet und das Skript beendet.
quelle
Wenn Ihr Programm auf SIGPIPE beendet wird (dies ist die Standardaktion), sollte es ausreichen, die Ausgabe in einen Reader zu leiten, der beim Lesen dieser Zeile beendet wird.
So könnte es so einfach sein wie
Wenn Sie die Standardausgabe unterdrücken möchten, verwenden Sie
Ebenso könnte man, wenn man nach einer bestimmten Anzahl von Zeilen anhalten möchte, den Kopf anstelle von sed verwenden, z
Der genaue Zeitpunkt der , an dem die Abtötung tritt nicht auf dem Pufferung Verhalten des Terminals wie stardt schlägt vor , in den Kommentaren ab.
quelle
sed
Beenden in die (defekte) Pipe zu schreiben . OP sagt "Diese Software druckt eine Zeile für jeden Abschnitt der Analyse, den sie abschließt". Dies kann bedeuten, dass das Programm einen zusätzlichen Abschnitt abschließt! Proof of Concept :{ echo 1; sleep 3; >&2 echo peekaboo; sleep 3; echo 2; } | sed -e '/1/q'
. Siehe diese Antwort . Mögliche Problemumgehung :( program & ) | sed -e '/Suitable text from the line/q'; killall program
. Machen Sie Ihre Antwort auf den Fehler aufmerksam und ich werde meine Ablehnung widerrufen.Alternativ zur Antwort von dmckee kann auch der
grep
Befehl mit der-m
Option (siehe z. B. diese Manpage ) verwendet werden:zu stoppen, wenn 1 Zeile gefunden wird, die mit dem Text übereinstimmt oder
auf 10 Zeilen warten, die nicht mit dem angegebenen Text übereinstimmen.
quelle
Sie können damit die
expect(1)
Standardausgabe eines Programms beobachten und dann vordefinierte Aktionen für einige Muster ausführen.Oder ein Einzeiler zum Einbetten in ein anderes Skript:
Beachten Sie, dass der
expect
Befehl nicht standardmäßig mit jedem Betriebssystem geliefert wird. Möglicherweise müssen Sie es installieren.quelle
set timeout -1
, dass ein unbestimmtes Zeitlimit festgelegt werden soll, da sonst alles unterexpect
dem Standardzeitlimit von 10 Sekunden geschlossen wird.Sie könnten eine "while" -Anweisung verwenden:
Sie müssen die Ausgabe Ihrer Software (oder ihrer Protokolle) weiterleiten und dann für jede neue Zeile einen bedingten Test durchführen und dann kill -KILL ausführen. Zum Beispiel (ich habe mit / var / log / messages als Protokolldatei getestet):
Oder direkt mit der Software:
Sie müssen den Protokollpfad / Anwendungsnamen, die übereinstimmende Zeile und die zu tötende PID ersetzen (Sie können auch killall verwenden).
Viel Glück mit Ihrer Software,
Hugo,
quelle