
Ich habe ein Skript mit diesem Code:
#!/bin/bash
tmux new-session -d bash
sleep 1d
echo 1 day passed
tmux kill-session
Soweit ich weiß, wird das Echo nach 24 Stunden in der Standardausgabe der Tmux-Sitzung angezeigt, jedoch nicht in meiner grundlegenden Bash-Sitzung (der Sitzung, die ich nach dem Booten meines Betriebssystems habe).
Wie kann ich sicherstellen, dass das Echo der Tmux-Sitzung (die natürlich eine Ebene über meiner grundlegenden Bash-Sitzung liegt) in meiner grundlegenden Sitzung gedruckt wird?
Ziel ist es, die sleep
Zeitphase zu nutzenin einem anderenSitzung, sondern um die Ausgabe aller Befehle zu erhalten, die unter sie fallenin meinemSitzung.
Natürlich kann ich den Ruhezustand in meiner Basissitzung nicht verwenden, da dies die Sitzung unbrauchbar oder „schläfrig“ machen würde.
Antwort1
Das Echo erscheint nach 24 Stunden im
tmux
Standardout der Sitzung.
Wenn Sie sich auf die tmux
Sitzung beziehen, die Sie vom Skript aus starten, dann ist dies nicht wahr. bash
Der Prozess, der das Skript ausführt, wartet auf tmux new-session -d bash
dessen Beendigung, dann wird es ausgeführt sleep 1d
und so weiter. Beachten Sie, dass tmux new-session -d bash
es fast sofort beendet wird, weil -d
(das andere bash
innerhalb der neu erstellten tmux
Sitzung nicht beendet wird, aber das ist jetzt irrelevant).
Ändern Sie die Verzögerung in sleep 10
und führen Sie das Skript aus. Warten Sie eine Weile und Sie werden sehen, dass es echo
zu IhremaktuellTerminal. Rufen Sie es als Nächstes auf, tmux ls
um zu sehen, dass eine neue, nutzlose Sitzung zurückgeblieben ist. Sie können sich daran anschließen und überprüfen, ob echo
dort nichts mit -ed versehen wurde.
Ich kann es nicht
sleep
in meiner Basissitzung verwenden, da dies die Sitzung unbrauchbar machen würde
Dasselbe gilt für Ihr Skript, wenn es im Vordergrund ausgeführt wird. Wie wäre es mit einem Hintergrundjob? Sie brauchen das tmux
überhaupt nicht:
(sleep 20s; echo surprise) &
Im Allgemeinendürfenauf ein anderes Terminal schreiben, wenn Sie die entsprechenden Berechtigungen haben. Folgendes kann ich in meinem Debian tun. Nehmen wir an, ich möchte aus Sitzung B schreiben, damit der Text in bash
Sitzung A sichtbar ist. Zuerst muss ich wissen, welches Gerät das stdout
von A eigentlich ist:
readlink /proc/$pid_of_bash_A/fd/1
Innerhalb von bash
A ist dies dank $$
spezieller Parameter einfacher:
readlink /proc/$$/fd/1
Die Ausgabe ist /dev/pts/3
in meinem Fall. Dann in der Sitzung B:
echo Hello World! > /dev/pts/3