Ich denke, jeder hat die Erfahrung, Skripten und Programmen, die nicht richtig funktionieren, Standardausgabeverarbeitung ("echo", "System.out.print ()" usw.) hinzuzufügen und sie zu debuggen. Ich denke, dass das Hinzufügen der Standardausgabeverarbeitung in verschiedenen Situationen verwendet wird, von der einfachen Überprüfung des Programmbetriebs bis zur Untersuchung in einer Umgebung, in der ein Debugger aufgrund von Einschränkungen nicht verwendet werden kann.
Das Hinzufügen einer ** 1-zeiligen Standardausgabeverarbeitung kann jedoch auch das Verhalten des Programms ** tödlich verändern.
In der Vergangenheit reagierte die Anwendung als Ergebnis des Hinzufügens einer Zeile "System.out.println (...)" zum Java-Programm, um das Problem zu umgehen, dass der Stapel aufgrund von "Echo" gestoppt wurde. Es gab Zeiten, in denen ich nicht zurückkehren konnte **. Ich möchte den Speicher zu dieser Zeit mit Beispielprogramm erklären.
Vor ungefähr 10 Jahren, eines Tages, erhielt ich eine E-Mail von mir, der für die Wartung eines bestimmten Systems verantwortlich war: "Die jährliche Charge wurde gestoppt. Bitte beeilen Sie sich, dies zu untersuchen." Wenn ich den Text weiter lese, heißt es, dass das Programm in der Zeile der Anweisung "echo" in der Batch-Datei gestoppt wird.
Als ich es zum ersten Mal hörte, bezweifelte ich das Missverständnis des Reporters, aber es ist wahr, dass eine Batch-Datei die folgenden vier aufeinander folgenden Zeilen von "Echo" enthält (Beispiel hier Es gibt k-tamura / stdout-probleme / blob / master / src / main / resources / annual.bat)),
・ ・ ・(Kürzung)・ ・ ・
echo %date% %time% ==================================================>> logs/result.log
echo %date% %time% [Step4] >> logs/result.log
echo %date% %time% Pre-Import Processing >> logs/result.log
echo %date% %time% >> logs/result.log
・ ・ ・(Kürzung)・ ・ ・
Als ich das ausgegebene Protokoll (result.log
) betrachtete, sah ich nur zwei Zeilen mit echo
-Nachrichten.
・ ・ ・(Kürzung)・ ・ ・
2007/09/28 12:04:44.72 ==================================================
2007/09/28 12:04:44.72 [Step4]
(Seitdem wurde kein Protokoll ausgegeben)
Ich dachte, "das ist nicht möglich", aber für den Fall, dass ich mich entschied, eine einfache Testumgebung zu erstellen und die Batch-Datei auszuführen. Das Ergebnis ist wie erwartet. Das Ereignis wurde nicht reproduziert und der Vorgang wurde normal abgeschlossen. Ich konnte mir nichts anderes vorstellen, als den Batch-Prozess von außen zu beenden.
Danach konnte ich den Reporter telefonisch kontaktieren. Als ich die Details hörte, wurde gesagt, dass dieser Stapel von einem Java-Programm aufgerufen wurde.
Das Java-Programm, das ich vom Reporter erhalten habe, enthielt die folgende main ()
-Methode und startete die Batch-Datei mit java.lang.ProcessBuilder
([Beispiel hier](https: //). github.com/k-tamura/stdout-problems/blob/master/src/main/java/org/t246osslab/stdoutproblems/batch/BatchImpl.java)).
import java.io.*;
import org.springframework.core.io.*;
public class BatchImpl implements BatchInterface {
public static void main(String[] args) {
System.out.println("Result: " + new BatchImpl().executeBatch());
}
public int executeBatch() {
try {
Resource resource = new ClassPathResource("annual.bat");
File batFile = resource.getFile();
ProcessBuilder pb = new ProcessBuilder(batFile.getAbsolutePath());
Process process = pb.start();
return 0;
} catch (IOException e) {
e.printStackTrace();
}
return -1;
}
}
* Der Quellcode ist viel einfacher als der eigentliche (zu diesem Zeitpunkt), wobei die Ausnahmebehandlung weggelassen wird, die nichts mit dem Problem dieser Geschichte zu tun hat. .. td> tr> Als ich das Java-Programm tatsächlich ausführte, wurde das Phänomen sofort unerwartet reproduziert. Sicherlich wurde die Meldung "Verarbeitung vor dem Import" nicht nach der Meldung "[Schritt 4]" angezeigt. Also, wenn ich das "Echo" entferne, wird es funktionieren? Ich habe es versucht und es funktioniert gut. Anscheinend tritt ein Ereignis auf, wenn es mehr als eine bestimmte Anzahl von ** RausfindenNachdem bestätigt wurde, dass das Ereignis reproduziert werden kann, wird die Untersuchung gestartet. Nach vielen Recherchen im Internet habe ich eine Ursache gefunden, die wahrscheinlich ist. Das heißt, ** Wenn der vom Java-Programm gestartete Ausgabestream des Prozesses ( Also habe ich eine Codezeile hinzugefügt, die den Ausgabestream mit "Process.getInputStream ()" liest und mit "System.out.println ()" an die Standardausgabe ausgibt.
Die Charge funktionierte dann einwandfrei, ohne anzuhalten. Das Problem, das direkt durch die große Anzahl von Batch-Standardausgabeverarbeitungen ("Echo") verursacht wurde, konnte durch Hinzufügen der Java-Standardausgabeverarbeitung ("System.out.println ()") gelöst werden. Wird sein.
|