Wie kann ich unter Linux einen Prozess ausführen, zu dem ich später zurückkehren kann, um nach dem Trennen einen Befehl einzugeben?

Wie kann ich unter Linux einen Prozess ausführen, zu dem ich später zurückkehren kann, um nach dem Trennen einen Befehl einzugeben?

Ich entwickle derzeit eine Server-Hosting-App (hauptsächlich für mich selbst / zu Lernzwecken) und alles funktioniert großartig und so weiter. Ich weiß nicht, wie viele von Ihnen mit Counter-Strike im Allgemeinen vertraut sind, aber ich starte meinen Server und alles ist in Ordnung, aber ich trenne mich davon (das ist alles in Node.js geschrieben), also kann ich screennichts verwenden oder so, aber im Grunde könnte ich, wenn ich das Level auf dem Server ändern wollte, etwas eingeben changelevel de_dust2oder so, wenn ich den Server manuell starten würde, aber da ich getrennt bin, habe ich keine Möglichkeit, diesem Prozess irgendwelche Befehle zu geben.

Ich habe über FIFOs und die Verwendung von Unix-Sockets gelesen, aber alles, was es zu tun scheint, ist ein Echo, das zu mir zurückkommt. Ich bin nicht sicher, ob ich FIFOs falsch verstehe, aber ich dachte, ich könnte

mkfifo /tmp/server echo "./startserver" > /tmp/server &

und dann später, wenn ich wollte

echo "changelevel de_dust2" > /tmp/server

Entschuldigen Sie, wenn ich mich nicht klar ausgedrückt habe. Im Grunde habe ich einen Daemon-Prozess, an den ich Befehle senden möchte.

Antwort1

Sie müssen sicherstellen, dass Ihr „Daemon“-Prozess aus der Pipe liest.

mkfifo /tmp/server
./startserver < /tmp/server &
sleep 10000 > /tmp/server &

Alles, was Sie später schreiben, /tmp/server/erscheint auf startserverder Standardeingabe von , zum Beispiel:

echo "changelevel de_dust2" > /tmp/server

Hinweis: Der sleepBefehl ist erforderlich, um die Pipe offen zu halten, da jeder echoBefehl versucht, sie zu schließen, wenn sie endet, was möglicherweise zu einer Beendigung führt startserver.

Antwort2

Mir fallen drei Möglichkeiten ein. Solange der Daemon-Prozess stdin/out verwendet, sollte die Kommunikation mit ihm kein Problem sein.

  1. Wenn Sie screen, tmux, oder eine ähnliche Lösung verwenden, müssen Sie den Server nicht trennen. Sie können ihn problemlos an der Konsole „angeschlossen“ lassen und den Bildschirm selbst trennen.

  2. Sie können es /proc/N/fd/{0,1}zur Kommunikation verwenden, solange Sie über die entsprechenden Rechte verfügen, wobei N die PID des Daemons, fd0 normalerweise der Standardeingang und fd1 der Standardausgang des N-Prozesses ist.

  3. Ihr Ansatz mit einer benannten Pipe (FIFO) ist im Wesentlichen richtig, aber Sie machen es nur halb richtig. Sie haben die Standardausgabe des Prozesses in die Pipe geändert, was bedeutet, dass alles, was vom Daemon in die Standardausgabe gedruckt wird, in die Pipe geschrieben wird, von wo aus Sie es beispielsweise mit cat extrahieren können. Die Pipe ist halbduplex, was bedeutet, dass sie nur einen Eingang mit einem Ausgang verbinden kann. Was Sie brauchen, sind zwei Pipes, eine für den Eingang, eine für den Ausgang. Dann kommt alles, was Sie über eine Pipe an den Daemon senden, dort an, während die Antwort über die andere Pipe zurück an ein anderes Programm geht, das die Pipe liest.

Angenommen, es gibt zwei Pipes pinund pout. Sie führen aus:

Daemon < Pin > Schmollmund

Dann müssen Sie etwas wie ausführen

Katzenschmollmund & Katze > Pin

um zu kommunizieren. Dies ist ein schlechtes Beispiel, da es asynchron ist, kann es zu Race Conditions kommen, aber ich hoffe, Sie verstehen, was ich meine.

verwandte Informationen