Wie kann ich eine GNU -Bildschirmsitzung richtig stoppen und sicherstellen, dass alle laufenden Prozesse getötet werden?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie kann ich eine GNU -Bildschirmsitzung richtig stoppen und sicherstellen, dass alle laufenden Prozesse getötet werden?

by Anonymous » 08 Mar 2025, 14:50

Ich verwende GNU -Bildschirm , um einen Dienst auszuführen. Wenn ich die Sitzung beende, werden die darin ausgeführten Prozesse nicht immer ordnungsgemäß beendet. Dies führt dazu, dass die Ports besetzt sind und verhindert, dass der Dienst sauber neu gestartet wird.

Code: Select all

screen -dmS my_service -L -Logfile /tmp/my_service.log zsh -i
< /code>
Um die Sitzung zu stoppen, mache ich derzeit: < /p>
screen -S my_service -X stuff 'kill -TERM -$$\n'
screen -X -S my_service quit
Das Problem:

Der Bildschirm ist geschlossen, aber die Prozesse darin (wie eine Java -Spring -App. Lingering -Prozesse. Beenden Sie die Sitzung: < /p>

Code: Select all

import subprocess

def stop_screen_session(session_name: str):
"""Stop a screen session and ensure all processes inside are killed."""
try:
# Get the session's main PID
get_pid_cmd = f"screen -ls | grep {session_name} | awk '{{print $1}}' | cut -d'.' -f1"
result = subprocess.run(get_pid_cmd, shell=True, capture_output=True, text=True, check=False)
pid = result.stdout.strip()

if pid:
# Kill all processes in the session's process group
subprocess.run(f"pkill -TERM -g {pid}", shell=True, check=True)

# Check if any processes are still running and force kill if necessary
check_cmd = f"ps -eo pgid | grep {pid}"
result = subprocess.run(check_cmd, shell=True, capture_output=True, text=True, check=False)

if result.stdout.strip():
print(f"Processes still running under session {session_name}, forcing termination.")
subprocess.run(f"pkill -KILL -g {pid}", shell=True, check=True)

# Quit the screen session
subprocess.run(f"screen -X -S {session_name} quit", shell=True, check=True)

print(f"Screen session {session_name} stopped successfully.")

except subprocess.CalledProcessError as err:
print(f"Failed to stop session {session_name}: {err}")

stop_screen_session("my_service")
Dies funktioniert nicht richtig ..

Top