Führen Sie das Skript in einem Bildschirm aus

25

Ich möchte ein Bash-Skript auf einem separaten Bildschirm ausführen. Das Skript ruft einige Male ein Programm auf, von denen jedes zu lange dauert, um zu warten. Mein erster Gedanke war, einfach einen Bildschirm zu öffnen und dann das Skript aufzurufen, aber es scheint, dass ich mich nicht lösen kann, ctrl-a dwährend das Skript ausgeführt wird. Also habe ich ein bisschen recherchiert und diese Anweisung gefunden , um den Shebang durch Folgendes zu ersetzen:

#!/usr/bin/screen -d -m -S screenName /bin/bash

Aber das funktioniert auch nicht (die Optionen werden nicht erkannt). Irgendwelche Vorschläge?

PS Mir fällt gerade ein, dass screen -dmS name ./script.shdas wahrscheinlich für meine Zwecke funktionieren würde, aber ich bin immer noch neugierig, wie ich das in das Skript einbauen kann. Vielen Dank.

Bongbang
quelle

Antworten:

28

Die Shebang- Linie, die Sie gesehen haben, funktioniert möglicherweise unter einigen Unix-Varianten, aber nicht unter Linux. Die Shebang-Linien von Linux sind begrenzt: Sie können nur eine Option haben. Die gesamte Zeichenfolge -d -m -S screenName /bin/bashwird als einzelne Option an übergeben screen, anstatt als unterschiedliche Wörter.

Wenn Sie ein Skript innerhalb des Bildschirms ausführen und nicht mit mehreren Dateien oder Zitaten herumspielen möchten, können Sie das Skript zu einem Shell-Skript machen, das den Bildschirm aufruft, wenn es nicht bereits innerhalb des Bildschirms ist.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -dm -S screenName /bin/bash "$0"; fi
do_stuff
more_stuff
Gilles 'SO - hör auf böse zu sein'
quelle
Es funktioniert gut, was ist das "$0"für hier?
Fabich
4
@ Lordofdark Das ist der Skriptname. Das Skript wird aufgerufen screen, /bin/bashwodurch das Skript erneut aufgerufen wird.
Gilles 'SO- hör auf böse zu sein'
16

Nach den Bildschirm-Manpages:

  • screen -d -m Startbildschirm im getrennten Modus. Dadurch wird eine neue Sitzung erstellt, aber keine Verbindung hergestellt. Dies ist nützlich für Systemstart-Skripte.
  • -S sessionname Setzen Sie den Namen der neuen Sitzung auf Sitzungsname.

Als ich den von Ihnen angegebenen Befehl ausgeführt habe: screen -dmS name ./script.sh

Der Bildschirm startet ein Fenster mit dem Namen name und führt die Datei script.sh automatisch aus. Um dorthin zurückzukehren und den Status anzuzeigen, geben Sie einfach Folgendes ein:screen -r test

Jetzt mit Ubuntu 14.04 sind die Befehle etwas anders. Versuchen:

screen -d -m -S test

Um das Skript jetzt auszuführen, müssen Sie zu ihrer Konfigurationsdatei gehen, um dies zu tun:

sudo vim /etc/screenrc

Sobald Sie dort sind, scrollen Sie nach unten und Sie werden sehen:

# Example of automatically running some programs in windows on screen startup.
#
#   The following will open top in the first window, an ssh session to monkey
#   in the next window, and then open mutt and tail in windows 8 and 9
#   respectively.
#
# screen top
# screen -t monkey ssh monkey
# screen -t mail 8 mutt
# screen -t daemon 9 tail -f /var/log/daemon.log

In diesem Abschnitt müssen Sie den auszuführenden Skriptnamen hinzufügen, damit Sie auf dem Bildschirm alles tun können, was Sie benötigen.

Ryekayo
quelle
Irgendwie screen -dmS ...funktioniert dieses Kommando ( ) bei mir nicht, obwohl es eigentlich sollte. Ich führe es aus und dann werden auch screen -lskeine Steckdosen gefunden. Gedanken?
Bongbang
Welche Distribution benutzt du?
Ryekayo
NAME = "Ubuntu" VERSION = "14.04.1 LTS, Trusty Tahr", denke ich. Es ist eine virtuelle Maschine.
Bongbang
Gimme ein bisschen, weil ich gerade die Arbeit verlasse und versuche, Bildschirm auf meinem Computer zu benutzen, der auch ubuntu 14.04
ryekayo 14.10.14
@bongbang - welche Bildschirmversion hast du?
slm
3

Dies ist ein bisschen alt, aber einer der wenigen Threads, die ich finden konnte, um dies zu tun. Nach dem Spielen mit arount ist die einzige Möglichkeit, dies mit ubuntu 14 im getrennten Modus zum Laufen zu bringen

screen -d -m -t nameofwindow sh nameoflaunch.sh

Der Start wäre der zweite Teil darüber, der die aktuellen Java-Befehle und die Serverversion enthält. Ich betreibe Vanille.

ProjectEd
quelle