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

322
XCritics

Ich entwickle gerade eine Server-Hosting-App (hauptsächlich für mich / zu Lernzwecken) und alles funktioniert großartig und was nicht, ich weiß nicht, wie viele von Ihnen allgemein mit Counter-Strike vertraut sind, aber ich starte meinen Server und alles ist ok, aber ich löse mich davon (dies ist alles in Node.js geschrieben), also kann ich es nicht verwenden screenoder nichts, aber im Grunde, wenn ich das Niveau auf dem Server ändern wollte, könnte ich changelevel de_dust2etwas eingeben oder etwas, wenn ich das starten würde Server manuell, 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 es scheint nur ein Echo bei mir zu sein. Ich bin nicht sicher, ob ich FIFOs 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

sorry, wenn mir nicht klar ist, im Grunde habe ich einen Daemon-Prozess, an den ich Befehle senden möchte.

0

2 Antworten auf die Frage

0
Dmitry Grigoryev

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

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

Später wird das, was Sie schreiben, /tmp/server/in startserverder Standardeingabe angezeigt, zum Beispiel:

echo "changelevel de_dust2" > /tmp/server 

Hinweis: Der sleepBefehl ist erforderlich, um die Pipe offen zu halten, da jeder echoBefehl versuchen wird, sie zu schließen, wenn sie endet, und möglicherweise beendet wird startserver.

Vielen Dank für Ihre Antwort, `startserver` ist etwas, das ein langfristiger Prozess ist, damit es nicht aufhört, bis ich es sage, wenn ich` startserver </ tmp / server` tippe, es hängt nur, dann muss ich STRG + C aus es passiert und nichts passiert. Was mache ich falsch? XCritics vor 8 Jahren 0
Der "sleep" -Befehl wurde hinzugefügt, um die Pipe am Anfang zu öffnen. Das sollte helfen. Möglicherweise müssen Sie die Verzögerung erhöhen oder durch "Katze" ersetzen, um die Leitung für immer offen zu halten. Dmitry Grigoryev vor 8 Jahren 0
Toll, das hat funktioniert! Aber warum hat es funktioniert? XCritics vor 8 Jahren 0
Wenn `startserver` versucht, von seinem STDIN zu lesen, wird es blockiert, bis jemand in die Pipe schreibt. Der Befehl `sleep 10000> / tmp / server` schreibt nichts, öffnet jedoch die Pipe zum Schreiben, was ausreicht, um den Prozess zu entsperren. Dmitry Grigoryev vor 8 Jahren 1
0
mikky

Drei Wege kommen mir in den Sinn. Solange der Daemon-Prozess stdin / out verwendet, sollte die Kommunikation damit kein Problem darstellen.

  1. wenn Sie verwenden screen, tmuxoder eine ähnliche Lösung, müssen Sie den Server nicht lösen. Sie können es sicher an der Konsole "angeschlossen" halten und den Bildschirm selbst abnehmen.

  2. Sie können /proc/N/fd/für die Kommunikation verwenden, solange Sie über die richtigen Rechte verfügen. Dabei ist N die PID des Deamons, fd0 ist normalerweise das Standardintervall und fd1 ist das Standardausdrucksignal des N-Prozesses.

  3. Ihr Ansatz mit einer Named Pipe (FIFO) ist im Wesentlichen richtig, aber Sie tun dies nur zur Hälfte. Was Sie getan haben, ist die Änderung des Standardausdrucks des Prozesses in die Pipe. Das bedeutet, dass alles, was vom Daemon auf den Standardausdruck gedruckt wird, in die Pipe geschrieben wird, von der Sie ihn beispielsweise mit cat extrahieren können. Die Pipe ist halbduplex, dh sie kann nur einen Eingang mit einem Ausgang verbinden. Was Sie brauchen, sind zwei Pipes, eine für die Eingabe, eine für die Ausgabe. Alles, was Sie über eine Pipe an den Dämon senden, wird dorthin gelangen, während die Antwort über die andere Pipe zu einem anderen Programm zurückkehrt, das die Pipe liest.

Angenommen, es gibt zwei Pfeifen pinund pout. Sie laufen:

Daemon <pin> Schmollmund

Dann musst du sowas laufen

katze schmollen & katze> pin

um zu kommunizieren. Dies ist ein schlechtes Beispiel. Es kann Rennbedingungen haben, da es asynchron ist, aber ich hoffe, Sie bekommen die Idee.

Kann man das mit Unix-Sockets machen? XCritics vor 8 Jahren 0
Ja. Solange Sie jedoch einfache Konsolenbefehle verwenden möchten, müssen Sie sie in eine Socket-fähige Methode wie BSD netcat (nc) packen. Wenn Sie Bash verwenden, müssen Sie auch mindestens eine Ersatzpipe bereithalten seit Bash kann meines Wissens kein sockelähnlicher bidirektionaler IPC-Kanal erstellt werden. Die Befehle würden also folgendermaßen aussehen: `daemon <pin | nc -lU socket> pin` und die Listener / Command-Schnittstelle würde wie "nc -U socket" aussehen. Passen Sie die nc-Einstellungen so an, dass sie nach EOFs, EOLs usw. erhalten bleiben. mikky vor 8 Jahren 0