After-the-Fact-Remote-Nohup mit tcsh

11

Ich habe eine tcsh-Instanz in einem xterm, die einen langfristigen (Wochen?) Prozess ausführt. Der Xvnc-Server, unter dem er ausgeführt wird, ist im Unkraut verschwunden. Es verbraucht 100% CPU und reagiert nicht. (Dies ist ein bekannter Fehler und ich weiß, dass er nicht behoben werden kann.)

Der langfristige Prozess blockiert derzeit auf stdout.

Gibt es eine Möglichkeit, einen zugrunde liegenden Prozess - den tcsh, den xterm, was auch immer - zu beenden und diesen langfristigen Prozess am Laufen zu halten?

(Bitte keine Antworten zu screen. Ich weiß. Es ist nicht mein Prozess; es ist ein Benutzer. Sie werden es nicht lernen.)

wfaulk
quelle

Antworten:

17

Dieser Beitrag kann helfen. Die Empfehlung lautet:

  1. Hintergrund des Prozesses (mit Strg-Z, dann bg )
  2. Führen Sie disown -h% [jobid] aus (wahrscheinlich ein Bash-Ismus, daher müssen Sie für tcsh übersetzen).

Die schlechte Nachricht ist natürlich, dass das BG in derselben Shell ausgeführt werden muss, in der der Prozess ausgeführt wird ... aber ... möglicherweise ist es bereits im Hintergrund.

Die wirklich schlechte Nachricht ist, dass der Ablehnungsaufruf möglicherweise in derselben Shell ausgeführt werden muss. In diesem Fall sind Sie geschraubt. Aber ich bin mir nicht sicher, vielleicht kann root es zwangsweise trennen.

Hmm. Mögliche gute Nachrichten - tcsh führt die Ablehnung automatisch durch:

Wenn tcsh abnormal beendet wird, werden Jobs, die im Hintergrund ausgeführt werden, beim Beenden automatisch abgelehnt.

Wenn Ihr langfristiger Prozess bereits im Hintergrund ausgeführt wird, sollte das Beenden des übergeordneten tcsh-Prozesses die Fortsetzung ermöglichen. Der Prozess ist jetzt vom Startterminal getrennt. (Wenn nicht, siehe "schlechte Nachrichten" oben.)

Leider ist es kein Bildschirm, so dass es keine echte Wiederverbindung gibt. Sie können es vielleicht mit gdb vortäuschen (wieder vom ersten Link):

[...] mit einigen schmutzigen Hacks ist es nicht unmöglich, einen Prozess 'stdout / stderr / stdin' erneut zu öffnen.

Sie können also weiterhin ein leeres Bildschirmfenster erstellen (z. B. das den Ruhezustand ausführt).

Und dann verwenden Sie gdb zum Beispiel, um eine Verbindung zum Prozess herzustellen. Führen Sie einen Anruf aus. Schließen (0)
Rufen Sie Schließen auf (1)
Rufen Sie Schließen auf (2)
Rufen Sie Öffnen auf ("/ dev / pts / xx", ...
).
nennen dup (0)
detach

Die Ausgabe des Prozesses wird auf dem Bildschirm angezeigt. Es würde nicht an dieses Bildschirmterminal angeschlossen werden, so dass beispielsweise [sic] den Befehl "sleep" beenden würde, nicht den Prozess, aber das könnte für das OP ausreichen.

Ich frage mich, ob es in diesem Prozess nicht auch "call dup (1)" und "call dup (2)" geben sollte ...

Quacksalber
quelle
Ja, es ist ein Vordergrundprozess, also bin ich wohl durchgeknallt.
wfaulk
Ja. aber wie du gesagt hast, es ist nicht dein Prozess, nicht deine Schuld. Tut mir leid, dass du mit dem Durcheinander feststeckst, tho.
Quacksalber Quijote
2
Das hat meinen Arsch total gerettet. Ich bin auf dasselbe Problem gestoßen, über das ich anfangs geschrieben habe, nämlich dass der Prozess auf STDOUT blockiert wurde, als der X-Server (und, wie ich denke, der xterm dazwischen) eingeklemmt wurde. Es stellte sich heraus, dass ich eigentlich nichts anderes tun musste, als STDOUT zu schließen. Diese Ausgabe war irrelevant; Die realen Daten befinden sich irgendwo in einer Protokolldatei. Also konnte ich mit gdb verbinden, "call close (1)" und dann "cont" ausführen und es geht wieder voran. Vielen Dank!
wfaulk
huh! interessant. das alles auftauen? Verrücktheit. froh, dass es dir geholfen hat!
Quacksalber Quijote
2
Es könnte erwähnenswert sein, dass das Senden von "Strg-Z" an einen Vordergrundprozess und das Senden von SIGSTOP an seine PID dasselbe sind. (SIGCONT startet den Prozess erneut.) Ich weiß nicht, ob dies für andere in derselben Situation hilfreich wäre oder nicht, aber in meinen Schnelltests sendet SIGSTOP gefolgt von SIGCONT-Duplikaten "Strg-Z" gefolgt von bg.
Wfaulk
3

Diese Fragen beziehen sich auf ein Programm namens Cryopid, das Ihnen helfen kann. Ich habe jedoch keine Erfahrung damit.

Verschieben eines Prozesses zwischen Hosts

Verschieben von xterms zwischen X-Sitzungen

Nohup und überprüfen Sie einen Prozess

Bis auf weiteres angehalten.
quelle
CryoPID klingt wirklich ordentlich, aber ich hatte eine Familie von Prozessen, und es unterstützt nicht das Einfrieren und Fortsetzen mehrerer Prozesse, zumindest noch nicht.
wfaulk