Shell-Skript: Bildschirm ausführen, mehrere Bildschirme öffnen und in jedem einen Befehl ausführen

Shell-Skript: Bildschirm ausführen, mehrere Bildschirme öffnen und in jedem einen Befehl ausführen

So ziemlich das, was der Titel schon sagt:

Mein Shell-Skript sollte

  • Führen Sie Befehl A aus und warten Sie, bis er abgeschlossen ist.
  • "Bildschirm" ausführen
  • Führen Sie den Befehl B1 im Startbildschirm aus
  • neues Fenster öffnen (normalerweise über Cmd-ac)
  • Führen Sie den Befehl B2 in einem neuen Fenster aus
  • neues Fenster öffnen
  • Führen Sie den Befehl B3 in einem neuen Fenster aus

Das ist alles, Sie müssen nicht warten, bis einige (oder alle) fertig sind, obwohl das Bonuspunkte bringen würde. Wie könnte ich das machen?

Antwort1

Starten Sie eine Hintergrundsitzung screenmit dem Namen „mysession“:

screen -d -m -S mysession

topIm ersten Fenster ausführen

screen -S mysession -X exec top

Starten Sie ein weiteres Fenster, nennen Sie es "win1" und führen Sie darin " vmstat 10" aus.

screen -S mysession -X screen -t win1
screen -S mysession -p win1 -X exec vmstat 10

Öffnen Sie ein weiteres Fenster, nennen Sie es "win2" und führen Sie darin " iostat 30" aus.

screen -S mysession -X screen -t win2 
screen -S mysession -p win2 -X exec iostat 30

So stellen Sie eine Verbindung her und sehen sich die Sitzung an:

screen -x -S mysession

Wenn eines der Programme beendet wird, wird das Fenster nicht geschlossen, da screenin jedem eine Shell gestartet wird (die Sie bei Bedarf verwenden können).

- ODER -Wenn Sie nur einen einzigen Befehl pro Fenster möchten oder nach Abschluss der Prozesse einfacher aufräumen möchten, führen Sie nicht die Standardshell in jedem Fenster aus, sondern nur den/die Befehl(e):

screen -d -m -S mysession top
screen -S mysession -p 0 -X title win0    # optional!
screen -S mysession -X screen -t win1 vmstat 10
screen -S mysession -X screen -t win2 iostat 30

screenwird das Fenster „beenden“ (wobei der Fensterinhalt möglicherweise intakt bleibt, siehe zombieunten), wenn der Prozess beendet wird, oder um sie herunterzufahren:

screen -S mysession -X quit   # nuke whole the session

oder

screen -S mysession -p win2 -X kill
screen -S mysession -p win1 -X kill
screen -S mysession -p 0 -X kill

(dadurch werden laufende Prozesse möglicherweise beendet, screenes wird jedoch jedem ein SIGHUP gesendet)

Wenn Sie möchten screen, dass Fenster automatisch geschlossen werden und das Programm beendet wird, wenn alle Prozesse abgeschlossen sind, fügen Sie nach dem Erstellen der Sitzung Folgendes hinzu (falls Sie es zombiein Ihrem nicht festgelegt haben .screenrc, ist dies wahrscheinlich ohnehin die Standardeinstellung):

screen -S mysession -X zombie

Dadurch werden die „Zombie“-Schließ- und Wiederbelebungstasten deaktiviert. Fenster verschwinden dann, wenn der Befehl in jedem Fenster beendet wird, und werden selbst geschlossen, wenn das letzte Fenster beendet wird. (Möglicherweise müssen Sie anstelle von screenverwenden , aber bei mir funktioniert nur Letzteres, trotz gegenteiliger Dokumentation.)defzombiezombie

verwandte Informationen