So führen Sie Code in einer neuen tmux-Sitzung aus - aus der aktuellen Sitzung heraus?

12

Ich benutze Ubuntu 16.04 und benötige die folgende tmuxLösung, da ich einen Timeout-Prozess ausführen möchte, da ich sleepin meinem speziellen Fall nicht zufrieden war atund einen Fehler mit nohup(beim Kombinieren nohup-sleep) festgestellt habe . Nun, es tmuxscheint die beste Alternative zu sein, da es einen eigenen No-Hangup- Mechanismus hat und tatsächlich im manuellen Betrieb einwandfrei funktioniert (ich stelle die Frage nur in Bezug auf die Automatisierung des Prozesses, den ich bereits manuell damit machen kann).

Was ich brauche:

Ich brauche eine Möglichkeit, die folgenden 3 Aktionen in einer Operation auszuführen:

  1. Neue tmuxSitzung anhängen .
  2. Injizieren eines fertigen Satzes von Befehlen in diese Sitzung, z (sleep 30m ; rm -rf dir_name ; exit). Besonders bevorzuge ich ein mehrzeiliges Set und keine lange Reihe.
  3. Das Ausführen des obigen Befehls setzt den Moment, in dem es beendet wurde, um in einer neuen tmuxSitzung als stdin geschrieben zu werden .

Mit anderen Worten, ich möchte einen Codesatz in einer anderen tmuxSitzung ausführen , die speziell für diesen Zweck erstellt wurde, aber alles in einem Vorgang ausführen.


Anmerkungen:

  • Ich versuche, alles aus meiner ursprünglichen Arbeitssitzung heraus zu machen (die, aus der ich die meiste Zeit heraus arbeite). Im Allgemeinen habe ich nicht die Absicht, die neu erstellte Sitzung zu besuchen, ich möchte sie nur mit dem automatisch ausgeführten Code erstellen und das wars.

  • Wenn möglich, würde ich eine Heredoc-Lösung vorziehen. Ich denke, es ist am effizientesten.

JohnDoea
quelle

Antworten:

18

Wenn Sie den Code eingeben, den Sie ausführen möchten /opt/my_script.sh, ist es sehr einfach, das zu tun, was Sie möchten:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Dadurch wird eine neue getrennte Sitzung mit dem Namen "myTempSession" gestartet, in der Ihr Skript ausgeführt wird. Sie können es später anhängen, um zu überprüfen, was es tut, indem Sie ausführen tmux attach-session -t myTempSession.

Das ist meiner Meinung nach die einfachste und eleganteste Lösung. Mir ist keine einfache Möglichkeit bekannt, Befehle von stdin (read "from heredocs") mit tmux auszuführen. Wenn Sie herumhacken, sind Sie vielleicht sogar in der Lage, es zu tun, aber es wäre immer noch ein Hack (und sieht aus wie ein Hack).

Beispiel: Hier ist ein Hack, der den oben vorgeschlagenen Befehl verwendet, um das gewünschte Verhalten zu simulieren (= Code in einer neuen tmux-Sitzung von einem Heredoc ausführen. Es erfolgt kein Schreibzugriff auf die Festplatte des Servers, da die temporäre Datei erstellt /dev/shmwird a tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF
Mario Vitale
quelle
1
Lieber Mario. Es ist immer eine Freude, Ihre Antworten zu lesen. Ich bin mir nicht sicher, ob ich das richtig verstehe. Bitte sagen Sie mir, wenn ich falsch liege: 1.Es gibt zwei Möglichkeiten, dies zu tun : Zum einen muss ein temporäres Skript (das den Code enthält) erstellt und mit der Erstellung ausgeführt werden, zum anderen handelt es sich um einen Heredoc Weg. 2.Wenn der zweite Weg funktioniert (wenn jede Echo-Zeile jede Code-Zeile des Heredocs enthält), warum sollten wir dies als Hack betrachten, wenn es ein Bash-gültiger Code ist? Vielleicht, weil Zeilen des Heredocs wiederholt und in Heredocs nicht regelmäßig ausgeführt werden?
JohnDoea
2
@Benia Es ist ein Hack, da es nur auf einigen Unix-Systemen funktioniert, die haben /dev/shm. Es ist auch ein Hack, da es komplizierter, schwieriger zu lesen, zu verstehen und zu warten ist, als das Skript einfach in eine gewöhnliche Datei zu schreiben und damit zu beginnen tmux.
Kusalananda
1
Wie @Kusalananda erklärte, sind Heredocs für die Codeausführung im Allgemeinen eine schlechte Praxis. Es ist zwar hässlich und unerreichbar, aber es zwingt Sie dazu, einen Umweg zu finden, um ansonsten sehr einfache Dinge zu tun. Vergleichen Sie einfach den ersten und den zweiten Codeblock in der Antwort: Können Sie sagen, wie es funktioniert? Wie lange brauchst du dafür? Es ist sogar noch mehr ein Hack, da tmux keine Möglichkeit hat, Befehle von stdin auszuführen (außer auf noch hässlichere Weise, die ich nicht einmal in Betracht ziehe), so dass externe Skripte die einzige1. Möglichkeit sind (Antwort auf die Ihrer Frage) .
Mario Vitale
1
Entschuldigung, im ersten Beispiel ist ein Fehler aufgetreten (der Befehl "new-session" ist nicht impliziert, wenn Sie Argumente verwenden). Jetzt ist es behoben.
Mario Vitale
1
Wenn ich tmux new-session -d -s "myTempSession" /opt/my_script.shes jetzt ausführe , wird keine temporäre Datei geöffnet, in die ich den Code einfügen kann ... Ich muss das Skript direkt aus der aktuellen Sitzung heraus öffnen oder zumindest etwas in die neue Sitzung verschieben und dann direkt in die neue Sitzung zurückkehren aktuelle Sitzung. Übrigens habe ich vor, für all deine Hilfe ein Kopfgeld zu geben, da ich mich so wenig wie möglich bei dir bedanken kann und ich in 11 Stunden ein Kopfgeld geben könnte.
JohnDoea