it-swarm.com.de

Wie man ein Shell-Skript schreibt, das die Tmux-Sitzung startet und dann ein Ruby-Skript ausführt

Ich möchte ein Shell-Skript schreiben, das Folgendes tut:

  • Erstellen Sie zunächst eine tmux-Sitzung
  • Führen Sie als Nächstes ein Ruby-Skript namens "run.rb" innerhalb der tmux-Sitzung aus

Was ich im Pseudo-Code tun möchte:

tmux new -s my_session
Ruby run.rb     # NOTE: I want this to run inside the my_session tmux session.
tmux detach

Wie mache ich das? (Weitere Beiträge, die ich gelesen habe, verwirrender wird es.)

31
hackstar15
#!/bin/bash
tmux new-session -d -s my_session 'Ruby run.rb'
  1. Erstellen Sie eine Datei mit dem Namen my_script.sh und geben Sie den obigen Inhalt ein.

  2. Machen Sie die Datei ausführbar, indem Sie Folgendes ausführen:

    chmod 755 my_script.sh oder chmod +x my_script.sh

  3. Führen Sie dann das Shell-Skript aus:

    ./my_script.sh

Das Shell-Skript ausführbar machen

Wenn Sie den Befehl chmod 755 filename ausführen, erlauben Sie allen Benutzern, die Datei zu lesen und auszuführen, und der Besitzer der Datei darf auch in die Datei schreiben. Sie benötigen dies möglicherweise für Perl und andere Skripts, die über einen Webserver ausgeführt werden sollen. Wenn Sie 755 auf ein Verzeichnis anwenden, bedeutet dies, dass jeder zu ihm gehen und seine Dateiliste anzeigen kann.

Diese Berechtigungen werden normalerweise in die Textdarstellung von rwxr-xr-x übersetzt.

Sie können alternativ chmod +x file_name für eine Datei verwenden, um sie ausführbar zu machen.

30

Der aktualisierte Code von KM Rakibul Islam enthält am Ende einen unnötigen Trennungsbefehl, der die Fehlermeldung "Kein Client gefunden" auslöst (my_session wurde bereits getrennt und ist daher nicht im Gültigkeitsbereich. . Der korrekte Code sollte lauten:

#!/bin/bash
tmux new-session -d -s my_session 'Ruby run.rb'
20
Nick

Sie können teamocil verwenden, um dies einfach zu tun. Sie können einfach eine YAML-Datei erstellen:

windows:
  - name: rubysession
    root: ~
    layout: tiled
    panes:
      - Ruby run.rb; tmux detach

Wenn Sie "rubysession.yml" genannt haben, führen Sie Folgendes aus:

teamocil rubysession

Und das würde perfekt für Ihren Zweck funktionieren und keine Hacks erfordern. Teamocil ist auch für viele andere Zwecke hervorragend geeignet!

2
Tom Anthony

Wenn Sie Ihre tmux-Sitzung nach dem Start einiger Befehle am Leben erhalten möchten, können Sie eine bash mit einer init-Datei starten:

tmux new -d -s mysession "bash --init-file foo.script"

wo foo.script Ihre Befehle enthalten würde. Alternativ können Sie den Befehl direkt von der Befehlszeile aus an die Shell senden:

tmux new -d -s mysession2 "bash --init-file <(echo Ruby run.rb)"

Beachten Sie, dass --init-file für das Lesen von systemweiten Initialisierungsdateien wie /etc/bash.bashrc gedacht ist, so dass Sie diese in Ihrem Skript "quellen" möchten.

0
jeroent

Ich bin mir nicht sicher, ob dies für Sie noch interessant ist, aber ich möchte Ihnen eine Antwort/einen Hinweis geben: Wenn Sie zum Beispiel mehrere tmux-Sitzungen per Shell-Skript starten und einen Befehl ausführen möchten, können Sie dies folgendermaßen tun:

# just for test and show case
mkdir test_1 test_2

echo "current tmux sessions"
tmux ls

echo "kill all tmux sessions"
tmux kill-server

declare -a directories=("test_1" "test_2")

for i in "${directories[@]}"
do
cd ${i}
pwd
tmux new -d -s ${i} "ls -la"
cd ..
done

Zur Demonstration erstellt das Skript einen Ordner test_1 und test_2. Danach habe ich ein Array mit den beiden Ordnern definiert und laufe durch die beiden Ordner und starte eine tmux-Sitzung mit dem aktuellen Ordnernamen und führe den Befehl "ls -la" aus.

Wenn Sie alle Unterverzeichnisse in Ihrem aktuellen Verzeichnis durchsuchen möchten, ersetzen Sie "für i" in "$ {directorys [@]}" durch "für f in *; Hier ist ein Beispiel, das auch symbolische Ordner ausschließt:

echo "current tmux sessions"
tmux ls

echo "kill all tmux sessions"
tmux kill-server dependencies

     for f in *; do
        if [[ -d "$f" && ! -L "$f" ]]; then
            cd ${f}
            pwd
            tmux new -d -s ${i} "ls -la"
            cd ..
        fi
    done

Hier ist ein Link zur Gist-Datei: https://Gist.github.com/AICDEV/cf1497793bb1c27cb9b94d56c209ad6f

0
doc.aicdev

Mit einigem Experimentieren habe ich herausgefunden, wie man tmux über ein Shell-Skript steuert.

tmux new-session -d -s htop-session 'htop';  # start new detached tmux session, run htop
tmux split-window;                             # split the detached tmux session
tmux send 'htop -t' ENTER;                     # send 2nd command 'htop -t' to 2nd pane. I believe there's a `--target` option to target specific pane.
tmux a;                                        # open (attach) tmux session.

Das obige teilt die tmux-Sitzung in zwei Fenster und führt htop in beiden aus.

Um die ursprüngliche Frage zu beantworten, können Sie ein Ruby Skript ausführen und die tmux-Sitzung nicht mit dem folgenden Befehl trennen:

tmux new-session -s Ruby_session 'Ruby run.rb';  # open tmux session and run Ruby script.
0
Quang Van