Wie kann ich PuTTY verwenden, um mit einem Dienst zu interagieren, der unter / dev / tty2 ausgeführt wird?

378
Walt D

Okay, ich habe also ein Programm (das ich nicht geschrieben habe und nicht ändern kann), das ich als Dienst systemdauf meinem Ubuntu 16.04 Cloud-Server verwende. Es funktioniert großartig, mit der Ausnahme, dass ich in der Lage sein muss, mit dem laufenden Programm zu interagieren, und die einzige Möglichkeit, mit der das Programm interagiert, ist die Verwendung von stdin/ stdout. Mir ist klar, dass es für einen Dienst ziemlich unkonventionell ist, nur Befehlszeileneingaben zu verwenden, aber ich sehe nicht, welche andere Wahl ich habe.

Von dem, was ich gelesen habe hier ist es möglich, einen Dienst zu sagen TTY zu verwenden für stdinund stdout, und so ich denke, ich mein Setup Service haben genau das zu tun:

[Unit] Description=My Service After=getty@tty2.service  [Service] Type=simple ExecStart=/path/to/my/service StandardInput=tty StandardOutput=tty TTYPath=/dev/tty2 TTYReset=yes TTYVHangup=yes Restart=always RestartSec=5 User=username  [Install] WantedBy=multi-user.target 

Sobald mein Dienst ausgeführt wird (und ja, er wird definitiv ausgeführt), versuche ich, den screenBefehl in PuTTY zu verwenden, um ihn /dev/tty2wie in dieser Antwort beschrieben anzuzeigen :

sudo screen /dev/tty2

Wenn ich das tue, sehe ich in PuTTY jedoch nur einen leeren Bildschirm ohne Ausgabe, mit dem ich nicht interagieren kann. (Und ja, das Programm erzeugt während des Laufens eine Menge Ausgabe.)

Ich bin mir also nicht sicher, wo ich etwas falsch gemacht habe, ob es sich um die Konfiguration des Dienstes, meine Verwendung des screenBefehls oder um PuTTY selbst handelt. Ich bin kein sehr erfahrener Benutzer von Linux im Allgemeinen und dies ist das erste Mal, dass ich etwas mit TTY mache, daher ist mein Verständnis ziemlich dünn.

2

1 Antwort auf die Frage

1
Kamil Maciorowski

Dies ist (noch) nicht getestet, könnte aber funktionieren.

Nachdem Sie sich angemeldet haben (über SSH mit PuTTY oder was auch immer), starten Sie eine neue tmuxSitzung (die ich benutze tmux, aber Sie können wählen screen), als ob Sie in einer Shell arbeiten möchten. Der einfache Befehl tmuxfunktioniert, aber nennen wir die Sitzung:

tmux new-session -s foo 

Dann finden Sie die PID von Ihrem service:

pidof service 

und verwenden Sie es reptyr, um es an Ihr aktuelles Terminal anzuschließen, das sich im Inneren befindet tmux(ich denke, dass Sie dies ebenfalls benötigen sudo). In dieser Antwort von mir finden Sie kurze Merkmale reptyrund was zu tun ist, damit es funktioniert.

reptyr <pid> 

Wenn Sie sich abmelden möchten, nehmen Sie zuerst aus tmuxmit Ctrl+ B, D(für screenes ist Ctrl+ A, D). Später können Sie mit zu diesem Terminal zurückkehren

tmux attach-session -t foo 

Sie müssen also reptyrerst nach dem nächsten Neustart erneut verwendet werden.


Wenn ich Sie wäre, würde ich versuchen, den Dienst von innen heraus auszuführen. tmuxIch gehe davon aus, dass dies tmuxohne Umwege mit TTY verbunden wäre systemd. Siehe dazu: Wie läuft man tmux/ screenmit systemd> 230?

So etwas wie:

… [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/tmux new-session -d -s foo /path/to/my/service User=username … 

Wenn dies funktioniert, müssen Sie tmux attach-session …den richtigen Benutzer ausführen :

sudo -u username tmux attach-session -t foo