2009-06-29 9 views
0

Ich bin ein paar Team Fortress 2-Servern laufen und ich möchte ein kleines Management-Skript schreiben.Problem mit nicht blockierenden Fifo in bash

Grundsätzlich sind die TF2-Server sind ein fg Prozess, der eine Server-Konsole bietet, so kann ich den Server, Typ Status starten und eine Antwort von ihm bekommen:

***@purple:~/tf2$ ./start_server_testing 
Auto detecting CPU 
Using AMD Optimised binary. 
Server will auto-restart if there is a crash. 

Console initialized. 
[bla bla bla] 
Connection to Steam servers successful. 
    VAC secure mode is activated. 

status 

hostname: Team Fortress 
version : 1.0.6.1/15 3883 secure 
udp/ip : ***.***.133.31:27600 
map  : ctf_2fort at: 0 x, 0 y, 0 z 
players : 0 (2 max) 

# userid name uniqueid connected ping loss state adr 

Große, jetzt möchte ich ein Skript erstellen welches den Befehl sm_reloadmins an alle meine Server sendet. Der beste Weg, um dies zu tun, ist eine Fifo namens Pipe. Nun, was ich tun möchte, ist diese Pipe schreibgeschützt und nicht blockierend für den Server-Prozess, so dass ich in die Pipe schreiben kann und der Server führt es aus, aber ich möchte immer noch über Konsole eins den Server schreiben, also wenn ich zurückwechsle zum fg-Prozess des Servers und ich tippe Status möchte ich eine Antwort gedruckt.

Ich versuchte dies (unter der Annahme serverfifo mkfifo serverfifo ist):

./start_server_testing < serverfifo 

nicht funktioniert, wird der Server nicht gestartet, bis etwas auf das Rohr geschrieben.

./start_server_testing <> serverfifo 

Das ist eigentlich ziemlich gut funktioniert, ich die Ausgabe der Konsole des Servers sehen und ich kann auf die Fifo schreiben, und der Server führt die Befehle aus, aber ich kann über die Konsole auf den Server nicht mehr schreiben. Wenn ich 'exit' in die Pipe schreibe (was den Server beenden soll) und ich es auf einem Bildschirm laufe, wird das Bildschirmfenster aus irgendeinem Grund gelöscht (wtf warum?).

Ich brauche nur den Server zu lesen, die Fifo ohne Blockierung und alle meine Tastatur-Eingabe auf dem Server selbst sollte an den Server gesendet werden und alle Server-Ausgang sollte auf der Konsole geschrieben werden.

Ist das möglich? Wenn ja, wie?

+0

Ich nehme an, indem ich "./start_server_testing <> serverfifo" verwende, ordne ich das stdio zu serverfifo zu, so verliert es meine Tastatur als stdio. Ist es möglich, dem stdio eines Prozesses zwei Quellen zuzuordnen (was in meinem Fall Keyboard und Serverfifo wäre). – timdel

+0

Ich habe Ihren letzten Eintrag gelöscht, einfach weil es keine Antwort war. Es tut mir leid, dass du nicht das Gefühl hast, dass die Seite dir geholfen hat, aber (re deinen Kommentar) Ich kann keine Beweise sehen, dass jemand "sauer" wird außer dir selbst - einfach jemand, der dir ihre Idee gab, die nicht passte Was Sie wollten ... –

Antwort

1

Ich weiß, dies ist keine Antwort in der gleichen Weise wie Sie verfolgten, aber Sie können dies wahrscheinlich tun using Gnu Screen.

Bildschirm ist ein Programm, das eine Pseudo-TTY erstellt. Sie können seine Fähigkeit nutzen, um eine Bildschirmsitzung zu teilen. Auf diese Weise können Sie im Bildschirm des Servers angemeldet sein, und Ihr Skript kann diese Sitzung freigeben, einen Befehl senden, den Sie sehen können, und dann die Freigabe beenden. Die process to get screen set up to allow sharing sessions is described here. Es erfordert Root-Zugriff, aber ich nehme an, dass Sie das haben, wenn Sie einen TF2-Server betreiben.

Sobald Sie den Setuid-Prozess eingerichtet haben und die Server-Eingabeaufforderung innerhalb des Bildschirms angezeigt wird, können Sie sich in das entsprechende Feld einloggen, eine Verbindung zum Bildschirm herstellen, den gewünschten Befehl an den Server senden, Strg-A senden. d, um den Bildschirm zu trennen und sich abzumelden.

+0

Ich benutze tatsächlich einen Bildschirm, in dem ich alle meine Server ausführen (STRG + A, c erstellt Windows in einem Bildschirm). Ich schrieb auch das: '[...] und ich führe es in einem Bildschirm das Bildschirmfenster wird aus irgendeinem Grund getötet (wtf warum?). [...]' Aber jetzt, kann ich schreiben der Bildschirm vielleicht?Ich weiß, wenn ich einen neuen Bildschirm erstelle, kann ich irgendwie einen Befehl senden, der auf dem Bildschirm ausgeführt wird, und dann trennen, aber kann ich einen Befehl an einen vorhandenen Bildschirm senden? – timdel

+0

Keine Wartezeit, ich denke, eine Pipe zu verwenden, um Text an einen Prozess zu senden, ist immer noch eine bessere Idee, als es an den Bildschirm zu senden. – timdel

+0

Ah. Ich habe nicht verstanden, was Sie in diesem Absatz gesagt haben. Die Tatsache, dass Sie den Bildschirm bereits verwenden, macht die Sache einfacher. Als Antwort auf Ihre Frage "kann ich einen Befehl an einen vorhandenen Bildschirm senden?", Meine Antwort war genau zu erklären, wie Sie diesen Prozess gehen würden. Wo war ich unklar? –

Verwandte Themen