Ich habe das Problem mal nachgestellt. Damit auch andere Forenteilnehmer damit arbeiten können, habe ich "top" verwendet, welches wohl ähnlich wie dein Java funktioniert.
Aufruf user1 (root) mit Zielbenutzer user2. Es mag sein, dass es mit user1 != root anders reagiert.
Code: Alles auswählen
screen -dmS Test su -c "bash -c 'while true;do top;done'" user2
Code: Alles auswählen
pstree -p|fgrep top
|-screen(126753)---su(126754)---bash(126755)---top(126756)
Mit ps,
lsof oder auch /proc/<pid> kann man sich einige Details anschauen.
Code: Alles auswählen
1.) user1, 126753, SCREEN -dmS Test su -c bash -c 'while true;do top;done' user2
2.) user1, 126754, su -c bash -c 'while true;do top;done' user2
3.) user2, 126755, bash -c while true;do top;done
4.) user2, 126756, top
Interessant ist nun, dass mit "screen -S Test -X quit" nur 1.) und 4.), jedoch nicht 2.) und 3.) beendet werden.
Prozess 2.) wird vom Vater SCREEN (126753) auf PID 1 umgehangen und läuft weiter.
Prozess 3.) läuft auch weiter, jedoch ohne erneut top auszuführen.
Es scheint so, dass mit "quit" der Kindsprozess 4.) korrekt beendet wird. Das führt aber nicht zum Beenden des darüber liegenden Vaterprozesses 3.) (vielleicht wegen while).
Screen scheint das egal zu sein. 1.) wird beendet, 2.) wird auf PID 1 umgehangen und 3.) hängt weiterhin an 2.) . Der Prozess 2.) verliert sein Pseudoterminal pts/xxx und wechselt den Status von Ss+ zu Ss (ohne + nicht mehr in "foreground process group"), was wahrscheinlich nur mit dem Pseudoterminal von Screen zusammenhängt.
Leider habe ich keine Erklärung für das Verhalten.