Ich habe einen lang laufenden Serverprozess in einer Bildschirmsitzung auf meinem Linux-Server. Es ist ein bisschen instabil (und leider nicht meine Software, daher kann ich das nicht beheben!), Daher möchte ich einen nächtlichen Neustart des Prozesses ausführen, um die Stabilität zu verbessern. Die einzige Möglichkeit, das System ordnungsgemäß herunterzufahren, besteht darin, zum Bildschirmprozess zu wechseln, zu dem Fenster zu wechseln, in dem es ausgeführt wird, und die Zeichenfolge "stop" auf der Steuerkonsole einzugeben.
Gibt es irgendwelche intelligenten Umleitungsfehler, die ich tun kann, um einen Cronjob zu veranlassen, diesen Stoppbefehl jeden Tag zu einer festgelegten Zeit zu senden?
ls -l /proc/7417/fd/0
./dev/pts/19
), dery
Charakter erreicht die Anwendung selbst nicht. Dies ist ähnlich wie bei Verwendung des Befehls write (1) . Probieren Sie auf jeden Fall meine andere Antwort oder ein grafisches Automatisierungswerkzeug wie xdotool aus .Bildschirmbasierte Lösung
Starten Sie den Server wie folgt:
Der Bildschirm wird im getrennten Modus gestartet. Wenn Sie also sehen möchten, was los ist, führen Sie Folgendes aus:
Steuern Sie den Server wie folgt:
(Diese Antwort basiert auf dem Senden von Texteingaben an einen getrennten Bildschirm von der Unix- und Linux- Geschwister-Site.)
Erklärung der Parameter:
TMUX-basierte Lösung
Starten Sie den Server wie folgt:
tmux wird im getrennten Modus gestartet. Wenn Sie also sehen möchten, was los ist, führen Sie Folgendes aus:
Steuern Sie den Server wie folgt:
Erklärung der Parameter:
quelle
Versuchen Sie dies, um zu beginnen:
Und das zu töten:
quelle
echo "xxx" > cmd
(weil die Pipe geschlossen wird). Obwohl einige Programme klug genug sind, umrewind(3)
ihre Standardeinstellungen wieder zu öffnen, wenn sie auf EOF stoßen.Es ist möglich, Eingabetext an einen laufenden Prozess zu senden, ohne das
screen
Dienstprogramm oder ein anderes ausgefallenes Dienstprogramm auszuführen. Sie können diesen Eingabetext auch an die Standardeingabedatei des Prozesses senden/proc/PID#/fd/0
.Der eingegebene Text muss jedoch auf eine spezielle Weise gesendet werden, damit er vom Prozess gelesen werden kann. Wenn Sie den eingegebenen Text über die reguläre Dateimethode senden
write
, erhält der Prozess den Text nicht. Dies liegt daran, dass dies nur an diese "Datei" angehängt wird, aber nicht den Prozess zum Lesen der Bytes auslöst.Um den Prozess zum Lesen der Bytes auszulösen, muss für jedes zu sendende Byte eine
IOCTL
Operation vom Typ ausgeführtTIOCSTI
werden. Dadurch wird das Byte in die Standardeingabewarteschlange des Prozesses gestellt.Dies wird hier anhand einiger Beispiele in C, Perl und Python erläutert:
https://unix.stackexchange.com/questions/48103/construct-a-command-by-putting-a-string-into-a-tty/48221
-
Um die ursprüngliche Frage zu beantworten, die vor fast 9 Jahren gestellt wurde, müsste der Cron-Job ein kleines Hilfsprogramm ausführen, das den Beispielen für diese andere Frage ähnelt und die Zeichenfolge "stop \ n" an diesen Serverprozess sendet in der Frage, indem Sie jedes der 5 Bytes über eine
IOCTL
Operation vom Typ sendenTIOCSTI
.Dies funktioniert natürlich nur auf Systemen, die den
TIOCSTI
IOCTL
Operationstyp unterstützen (wie Linux), und nur über dasroot
Benutzerkonto, da diese "Dateien" unter/proc/
"Eigentümer" von " sind"root
.quelle
Falls es jemandem hilft:
Ich hatte ein ähnliches Problem und da der Prozess, den ich verwendete, nicht unter
screen
oder lagtmux
, musste ich einen anderen Ansatz wählen.Ich habe an
BEARBEITENgdb
den angehängt, in demxterm
mein Prozess ausgeführt wurde, und habecall write(5, "stop\n", 5)
from verwendetgdb
, um in den Master-Pty-Dateideskriptor zu schreiben.Ich fand heraus, an welchen Dateideskriptor die Daten gesendet werden sollten, indem ich nach
/proc/<pid>/fd
einem Link zu/dev/ptmx
und dann nach einem Versuch und Irrtum zwischen den beiden Optionen suchte (das Senden meiner Zeichenfolge an beide übereinstimmenden Dateideskriptoren schien keinen Schaden zu verursachen).Es stellte sich heraus, dass der
ENDE BEARBEITENxterm
Prozess , an den ich angehängt hatte, mit derspawn-new-terminal()
xterm
Aktion einer Tastenkombination erzeugt wurde und der zweiteptmx
geöffnete Dateideskriptor einfach derptmx
des übergeordnetenxterm
Prozesses war, der nicht geschlossen worden war.Daher hatten die Versuchs- und Fehleraufrufe eine Ausgabe an das andere Terminal gesendet.
Die meisten
xterm
Prozesse haben keine zweiptmx
Dateideskriptoren.Dadurch wurde die Zeichenfolge effektiv in das Terminal eingegeben und an den Prozess weitergeleitet, der unter dem Terminal ausgeführt wird.
Hinweis: Möglicherweise müssen Sie das Anhängen an einen laufenden Prozess mit so etwas wie zulassen
sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"
quelle
Da ich die am meisten akzeptierte Antwort von Cristian Ciupitu (von 2010) nicht kommentieren kann, muss ich dies in einer separaten Antwort ausdrücken:
Diese Frage wurde bereits in diesem Thread gelöst: https://stackoverflow.com/questions/5374255/how-to-write-data-to-existing-processs-stdin-from-external-process
Zusamenfassend:
Sie müssen Ihren Prozess mit einer Pipe für stdin starten, die beim Durchschreiben der aktuellen Eingabe weder blockiert noch schließt. Dies kann durch eine einfache Endlosschleife realisiert werden, die an den jeweiligen Prozess weitergeleitet wird:
Ich kann bestätigen, dass dies anders ist als Krissis Art, eine Pfeife zu öffnen, die in meinem Fall nicht funktioniert hat. Die gezeigte Lösung hat stattdessen funktioniert.
Anschließend können Sie in die Datei ... / fd / 0 des Prozesses schreiben, um Anweisungen an sie zu senden. Der einzige Nachteil ist, dass Sie auch den Bash-Prozess beenden müssen, der die Endlosschleife ausführt, nachdem der Server heruntergefahren wurde.
quelle