Ich habe nach einer Möglichkeit gesucht, einen Befehl an eine getrennte Bildschirmsitzung zu senden. So weit, ist es gut. Das habe ich mir ausgedacht:
$ screen -S test -p 0 -X stuff 'command\n'
Dieser Befehl funktioniert wie es sollte. Aber ich möchte auch die Ausgabe, die direkt vor meinen Augen wiedergegeben wird (keine .log
Datei oder ähnliches, ich möchte nur die Ausgabe).
Die Verwendung des screen -L
Befehls ist keine Option.
linux
ubuntu
gnu-screen
Robin
quelle
quelle
screen
? Ist das nicht das, wofür untergeordnete Prozesse gemacht sind?Antworten:
Verwenden Sie ein First-In-First-Out-Rohr:
Verwenden Sie einen Umleitungsoperator. Leiten Sie die Ausgabe des Befehls wie folgt nach / tmp / test um:
Dann in einer anderen Schale
Beachten Sie, dass Sie Fehlermeldungen möglicherweise auch mit dem Operator 2> & 1 umleiten möchten .
Beispiel
Wie in den Kommentaren gefordert, nehmen wir an, wir haben ein PHP-Skript, das Benutzereingaben akzeptiert und die Serverlast bei der Eingabe von "status" ausgibt:
Sie erstellen zwei Fifos:
Sie rufen einen Bildschirm auf:
Nennen wir es in einer anderen Konsole Konsole 2, um den Namen Ihres Bildschirms herauszufinden:
In Konsole 2 senden Sie den Befehl an den Bildschirm:
Sie sehen den Befehl auf dem Bildschirm. Jetzt in Konsole 2 können Sie Befehle an Ihren PHP-Prozess senden:
und lies daraus:
quelle
Ich habe ein Python-Skript, das zahlreiche getrennte Bildschirmsitzungen verfolgt und die Ausgabe von jeder erfasst (wenn Verwendungsbefehle wie free, top -bn2, iostat regelmäßig über 'stuff' gesendet werden).
Anstatt zu einer Datei umzuleiten und somit mindestens eine Datei pro getrennter Bildschirmsitzung zu verwalten, leite ich einfach zu den von meiner übergeordneten Sitzung verwendeten tty / pts um.
Schritt 1: Starten Sie eine neue Bildschirmsitzung (mit einem für Menschen lesbaren Namen) im getrennten Modus.
Schritt 2: Senden Sie Ihre Befehle (ich verwende den Befehl 'free -g' zusammen mit 'uname -r') über Zeug. Es ist wichtig, das zu verwendende Fenster (in unserem Fall das erste und einzige Fenster) mit -p anzugeben.
Schritt 3: Der obige Schritt sendet nur den Befehlstext. Wir müssen auch einen Wagenrücklauf an diese getrennte Bildschirmsitzung senden, damit die Shell unseren Befehl ausführt. Das ASCII-Zeichen 015 ist auf den meisten * nix-Systemen ein Wagenrücklauf.
Schritt 4: Leiten Sie die Ausgabe unserer getrennten Bildschirmsitzung auf unsere aktuellen tty / pts um:
Die Ausgabe von Schritt 4 sieht ungefähr so aus:
Obwohl dies ein bisschen kompliziert zu sein scheint, ist der Prozess leicht skriptfähig. Mit Python kann ich die Ausgabe von Schritt 4 analysieren und nur die Daten erfassen, die mir wichtig sind.
Ich entschied mich für ein einfaches Szenario wie das Abrufen von IP-Details und schrieb ein Beispielskript, um die obigen Konzepte zu demonstrieren. Fühlen Sie sich frei zu ersetzen und zu basteln, wie Sie es für richtig halten.
Beispiel eines Python-Skripts zum Abrufen von IP-Details aus einer getrennten Bildschirmsitzung:
Über dem Skript in Aktion:
quelle
screen -X logfile /tmp/something
;screen -X log on
;screen -X stuff "command param"
;screen -X log off
in diesem Szenario noch besser zu arbeiten.Beispiel:
quelle