Bash IPC: Wie Pipe richtig aufbauen, starten und aufrufen?

CyborgBeta schrieb:
Mal anderes gefragt, wie komme ich an die Konsolenausgabe nach dem restart-Aufruf heran, also an das, was ich (bunt) in der Konsole sehen kann?
Das ist der stdout-Stream!
 
@Krik aber vom docker daemon, nicht von dem Aufruf.
Ergänzung ()

Habs hinbekommen:

(Back-)Backend-Code execpipe.sh:

Bash:
#!/bin/bash
while true; do
    data="$(cat /home/ich/pipe/mypipe)";
    if [ -n "$data" ]; then
        if [ "$data" = "restart" ]; then
            docker compose restart my-service
            sleep 5
            docker compose logs --tail 5 | ansi2txt > output.txt
            touch output_ready
        fi
    fi
done

Backend- bzw. Container-Code:

Java:
    get(
        "/restart",
        (req, res) -> {
          try {
            int[] rs = new int[4];
            rs[0] =
                Runtime.getRuntime()
                    .exec(new String[] {"bash", "-c", "echo \"restart\" > /hostpipe/mypipe"})
                    .waitFor();
            rs[1] =
                Runtime.getRuntime()
                    .exec(
                        new String[] {
                          "bash", "-c", "while [ ! -f /hostpipe/output_ready ]; do sleep 1; done"
                        })
                    .waitFor();
            List<String> lines = Files.readAllLines(Path.of("/hostpipe/output.txt"));
            rs[2] = Path.of("/hostpipe/output.txt").toFile().delete() ? 0 : 1;
            rs[3] = Path.of("/hostpipe/output_ready").toFile().delete() ? 0 : 1;

            List<String> restartResults = new LinkedList<>(lines);
            restartResults.add(Arrays.toString(rs));
            Map<String, Object> model = new HashMap<>();
            model.put("restart", restartResults);
            return new VelocityTemplateEngine().render(new ModelAndView(model, "index-view.html"));
          } catch (Exception e) {
            return "Error: " + e.getMessage();
          }
        });

Ablauf: Container fragt nach "restart", back-back-end macht restart, schreibt den Log ohne Farben in eine Datei und erstellt noch eine Datei, dass die Ausgabe fertig ist. Container wartet auf die Datei und gibt das Ergebnis dann ans Frontend weiter. Danach löscht Container die temporären Dateien wieder.

Python ist an keiner Stelle im back-back-end notwendig.
 
Zuletzt bearbeitet:
Dass du > im Code verwendest, zeigt, dass du auf den stdout-Stream zugreifst und woanders hin umleitest (in diesem Fall in eine Datei). 🤫

CyborgBeta schrieb:
Python ist an keiner Stelle im back-back-end notwendig.
Dafür verwendest du halt eine andere Programmiersprache, denn Bash ist das nicht. Könnte Java oder C# sein. Für mich riecht es aber eher nach C#.
 
Ist Java.

Du meinst docker compose logs --tail 5 | ansi2txt > output.txt, oder? Das ist ja auch richtig, die Ausgabe von logs wird in eine extra Datei geleitet.

Mit "keine Stdout-Ausgabe" meinte ich dieses Biest hier: docker compose restart my-service ...
 
CyborgBeta schrieb:
Mit "keine Stdout-Ausgabe" meinte ich dieses Biest hier: docker compose restart my-service ...
Ich habe es nachvollziehen können. Die Ausgabe von dem Ding kann man nicht in eine Datei umleiten.

Was haben die da gemacht? Es kann keine "normale" Terminalausgabe sein, sondern muss sich in einem Programm befinden (ein extra Fenster sozusagen). Daher kommt auch nichts über stdout raus. Jetzt sag nicht, dass die das wegen der der kleinen busy-Animation gemacht haben. 🫣

CyborgBeta schrieb:
Oh, interessant. Ich weiß, dass man da gelegentlich method chaining macht, aber in C# findet man das quasi überall (vor allem bei LINQ).
 
  • Gefällt mir
Reaktionen: nutrix
Krik schrieb:
Was haben die da gemacht? Es kann keine "normale" Terminalausgabe sein, sondern muss sich in einem Programm befinden (ein extra Fenster sozusagen). Daher kommt auch nichts über stdout raus. Jetzt sag nicht, dass die das wegen der der kleinen busy-Animation gemacht haben. 🫣
Jap, das vermute ich auch ... 🙈
 
Zurück
Oben