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

@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 ... 🙈
 
Hast du dir da gerade selbst geantwortet? Die letzte Antwort ist von über einem Jahr… der Fragesteller hat auch immer solche Fragen gestellt wie du.
 
  • Gefällt mir
Reaktionen: Bob.Sponge
Vielleicht stoßen Andere ja auch irgendwann mal auf so ein Problem.
 
sh. schrieb:
Hast du dir da gerade selbst geantwortet? Die letzte Antwort ist von über einem Jahr… der Fragesteller hat auch immer solche Fragen gestellt wie du.

Ja, hat er.
@CyborgBeta, @N.N., @Tobias0, @KarlGa, @Anna R, @kali-hi alles das selbe. Gestaltet stets am liebsten die Hitparade im Forum mit.

Kann sich auch sonst keiner ausdenken, sich selber zu antworten. Typischerweise enden dann seine Threads ja auch oft eher in einem Blog, statt in einem Dialog.

kali-hi schrieb:
Vielleicht stoßen Andere ja auch irgendwann mal auf so ein Problem.

Sehr wahrscheinlich eher nicht. Würden dann wohl auch eher einen neuen Thread aufmachen, statt eine einjährige Leiche zu fleddern, denkst du nicht?

Dennoch: auch dir eine besonders gute Weihnachtszeit bzw. einen guten Jahreswechsel. Das Fest der Hoffnung sollte jedem eine Chance geben und sein.
 
Zuletzt bearbeitet:
Zurück
Oben