Eigentlich wollte ich mir nur schnell ein Perl-Skript schreiben, das mir auf einem Linux Rechner mehrere Skripte startet und zwar jedes in seinem eigenen Screen. Das Perl-Skript war auch nicht das Problem, mit screen hatte ich da schon mehr zu kämpfen.

Aber ich war erfolgreich, hier kurz meine Erkenntnisse und Ergebnisse. Der Einfachheit halber verwendet ich den Befehl top, da man bei top sehr gut die Aktivität sieht und es sich nicht sofort wieder beendet. Meine Tests mit ls waren genau deshalb wenig hilfreich. Zuerst habe ich die man-page überfolgen und ein wenig im Netz gesucht und dann eine Weile zumprobiert. Die erste Idee, alles in einem einzigen Aufruf zu machen hat mich nach einigen missglückten Versuchen hierhin gebracht:

screen -d -m -S test top

test ist hier der Name meines Screens und top wie gesagt der Befehl, den ich ausführen möchte. Das klappt soweit ganz gut, mit screen -r test kann ich mich mit dem screen verbinden und sehe das laufende top. Der Nachteil dabei ist, dass sich der screen wieder beendet, wenn ich top mit q beende. Das mag in vielen Fällen nicht schlimm sein, ich wollte den screen aber hinterher behalten, da ich ja eigentlich mehr machen wollte als nur top. Also der nächste Versuch, dieses Mal in zwei Schritten:

screen -d -m -S test
screen -S test -X stuff top

Was mache ich hier? Der erste Befehl erstellt einen screen mit Namen test an den ich mich mit screen -r test verbinden könnte. Das war einfach, im zweiten Befehl steckt etwas mehr drin und es muss auch noch etwas mehr dazu.

screen -S test -X stuff top versucht top an den screen test zu schicken und auszuführen. stuff übernimmt sozusagen das Einfügen des Befehls. Das funktioniert allerdings nur, wenn ich mich vorher schon von Hand mit dem screen verbunden habe, also verbinden, detachen und dann das zweite Kommando ausführen. Wenn ich mich jetzt wieder an den screen attache, sehe ich top im Prompt stehen und könnte es mit Return starten.

Also habe ich zwei Probleme:

  1. Das attachen und detachen von Hand muss wegfallen, das kann ich in meinem Skript natürlich nicht brauchen.
  2. Ich will das Kommando nicht nur im Prompt stehen haben, es soll auch ausgeführt werden.

Die Lösung dafür sieht folgendermaßen aus:

screen -S test -X -p0 stuff "top $(echo -ne '\r')"

Problem 1 löse ich mit -p0, das sagt dem screen Kommando, dass ich meinen Befehl an das Window 0 im screen schicken will. Problem 2 löst der etwas kryptisch aussehende Ausdruck am Ende, der im Prinzip ein Return an den Befehl anhängt, dass er auch gleich ausgeführt wird. Wenn ich jetzt in den screen reinschaue sehe ich ein laufendes top. Problem gelöst, damit läuft mein Perl-Skript ganz prima, einfach nur die Kommandos zusammenbasteln und jedes an seinen eigenen Screen senden.