Hintergrundprozess (nohup &) wird angehalten/fortgesetzt, wenn sich der Benutzer abmeldet/anmeldet

Hintergrundprozess (nohup &) wird angehalten/fortgesetzt, wenn sich der Benutzer abmeldet/anmeldet

Ubuntu Server 11.10

Wenn ein normaler (nicht root-)Benutzer einen Prozess mit nohup (nohup java ... &) startet und der Benutzer die Verbindung zum Terminal (ssh) trennt, reagiert der Prozess nicht mehr. Wenn der Benutzer sich erneut verbindet, beginnt der Prozess wieder zu reagieren. Beispielsweise ist der Prozess eine Datenbank (H2), die auf keine Abfragen mehr reagiert, wenn der Benutzer, der den Prozess gestartet hat, die Verbindung zum Terminal trennt, und wieder zu reagieren beginnt, wenn der Benutzer sich erneut anmeldet.

Gibt es mir unbekannte Berechtigungen für Hintergrundprozesse, die verhindern, dass der Prozess im Hintergrund ausgeführt wird? Was könnte die Ursache für dieses Verhalten sein?

Antwort1

nohupsollte für Sie funktionieren, was war Ihr genauer Befehl? Vielleicht übersehen Sie etwas. Hier ist ein Abschnitt aus Wikipedia dazu:

Nohupping backgrounded jobs is typically used to avoid terminating them when logging
off from a remote SSH session. A different issue that often arises in this situation
is that ssh is refusing to log off ("hangs"), since it refuses to lose any data
from/to the background job(s).  This problem can also be overcome by redirecting all
three I/O streams:

nohup ./myprogram > foo.out 2> foo.err < /dev/null &

Sie könnten also etwa Folgendes tun:

ssh -n -f user@remotebox "sh -c 'cd /foo/bar; nohup ./myprogram > foo.out 2> foo.err < /dev/null &'"

Oder wenn das immer noch nicht funktioniert, können Sie versuchen, screenIhren Prozess im „Hintergrund“ laufen zu lassen, und er wird auch nach dem Abmelden weiterlaufen.

Gehen Sie zunächst sshzur Remote-Box, verwenden screenund starten Sie dann von dort aus Ihren Prozess. Sie können screenihm bei Bedarf einen Sitzungsnamen geben. Sie werden keinen wirklichen Unterschied bemerken, aber starten Sie Ihren Prozess in dieser Sitzung. Sie können die screenSitzung dann mit dem Befehl beenden Ctrl-a d. Es sieht ungefähr so ​​aus:

user@remotebox:~$ screen -S foobarsession
user@remotebox:~$ startmyprocess
[detached from 4865.foobarsession]
user@remotebox:~$

Sie können dann Ihre SSH-Sitzung beenden und der Prozess wird weiter ausgeführt. Um die Verbindung zur screenSitzung später wiederherzustellen, kehren Sie per SSH zur Remote-Box zurück und verwenden Sie screen -rzum erneuten Verbinden. Sie können screen -lszum Auflisten der Sitzungen verwenden.

user@remotebox:~$ screen -ls
There is a screen on:
        4865.foobarsession     (10/05/2012 11:10:57 AM)     (Detached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$ screen -r foobarsession
user@remotebox:~$ screen -ls
        4865.foobarsession     (10/05/2012 11:10:57 AM)     (Attached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$

Antwort2

Mit gestartete Prozesse nohup ... &sind so konzipiert, dass sie auch nach dem Beenden des Terminalprozesses ausgeführt werden. Ich glaube nicht, dass es einen Unix-Kernmechanismus gibt, der solche Prozesse anhält. Der Scheduler könnte jedoch seine Priorität ändern (weil er als nicht so wichtiger Prozess angesehen werden könnte).

Ich bin ziemlich sicher, dass der Prozess weiterläuft, aber etwas wie eine Pipe blockiert ihn und verhindert, dass er reagiert.

verwandte Informationen