Wie wechselt man SYSIN und SYSOUT (Curses-Modus) für einen Hintergrundprozess in eine andere Terminalsitzung (Bildschirmdienstprogramm)?

386
Simon Sobisch

Ich führe zurzeit einen Hintergrundprozess aus, der von einem Deamon-Prozess gestartet wird. Es hat kein Terminal und funktioniert gut, da es keine I / O-Bildschirme gibt. Es wird über ein Shell-Skript gestartet, das ich ändern kann. Das Shell-Skript erbt die Umgebung des Daemons, richtet zusätzliche Umgebungsvariablen ein und startet schließlich das Programm über exec $PROG arg1 "arg 2" 1>&2.

Für den Betrieb im "Debug-Modus" ist eine E / A-Anzeige erforderlich (Curses-Modus).

Was ich bisher ausprobiert habe:

  • exec screen -dmS FIXME $PROG arg1 "arg 2" führt zu einem nicht startenden Programm mit der Fehlermeldung "Ungültiger Dateideskriptor"
  • exec $PROG arg1 "arg 2" 1>/dev/pts/5 ergibt sich ein Startprogramm, alle Ausgaben sind auf / dev / pts / 5 zu sehen, natürlich ist keine Eingabe möglich
  • exec $PROG arg1 "arg 2" 1>/dev/pts/5 <namedpipeführt zu einem Startprogramm, alle Ausgaben sind in / dev / pts / 5 zu sehen, nehmen Eingaben über eine echo stuff > namedpipeandere Sitzung vor, aber dies kann nicht verwendet werden, da alle Funktionstasten verwendbar sein müssen.

Die "offensichtliche" Lösung, an die ich dachte (aber nicht funktioniert hat):

  • Starten Sie einen Bildschirm in einer anderen Konsole screen -dmS "FIXME"
  • den Hintergrundprozess über diese Bildschirmsitzung nutzen lassen exec screen -S "FIXME" -X stuff "$PROG arg1 \"arg 2\" "(Newline wird benötigt, emuliert das Drücken der EnterTaste)
  • Anbringen am Bildschirm über screen -r "FIXME"(Wiederanbringen von Arbeiten)

Problem hier: Hiermit wird nur ein einzelner Befehl an die Sitzung gesendet, die nicht funktioniert, da die gesamte Umgebung fehlt (beginnend mit dem aktuellen Verzeichnis und mit allen Umgebungsvariablen). [Edit: posted eine mögliche Lösung Hack als Antwort (die ursprüngliche Frage noch unbeantwortet ist)]

Frage: Kann der Hintergrundprozess über das Bildschirmdienstprogramm gestartet werden? (Die beste Option wäre, wenn die neue Bildschirmsitzung vom Hintergrundprozess aus gestartet wird [Problem hier: Dieser Prozess hat überhaupt keine Konsole) und einfach aus einem anderen Fenster neu angefügt werden.

Wenn dies nicht möglich ist: Gibt es andere Problemumgehungen?

1

1 Antwort auf die Frage

0
Simon Sobisch

Beantwortet die ursprüngliche Frage nicht, funktioniert aber in den meisten Fällen:

  • Speichern Sie alles aus der Umgebung, die für eine temporäre Datei wichtig ist
  • Senden Sie die folgenden Befehle an screen: Wechseln Sie in das Verzeichnis, geben Sie die temporäre Datei aus, entfernen Sie die temporäre Datei, starten Sie das Programm

Code:

 rm some_env.$$ for e in $(env | grep "PATH\|WHATEVERISIMPORTANT") do  echo "$e" >> some_env.$$ done exec screen -S "FIXME" -X stuff "cls cd $(pwd) . some_env.$$ rm . some_env.$$ $PROG arg1 \"arg 2\" "