Index: remoting/tools/me2me_virtual_host.py |
diff --git a/remoting/tools/me2me_virtual_host.py b/remoting/tools/me2me_virtual_host.py |
index 6b62d26791c8cc21c723fcd6ae1840ace1e4a104..cee9654dcf5f79bdcbfa64440a9789d07acca44b 100755 |
--- a/remoting/tools/me2me_virtual_host.py |
+++ b/remoting/tools/me2me_virtual_host.py |
@@ -634,16 +634,20 @@ def daemonize(log_filename): |
def cleanup(): |
logging.info("Cleanup.") |
+ global g_pidfile |
if g_pidfile: |
try: |
g_pidfile.delete_file() |
+ g_pidfile = None |
except Exception, e: |
logging.error("Unexpected error deleting PID file: " + str(e)) |
+ global g_desktops |
for desktop in g_desktops: |
if desktop.x_proc: |
logging.info("Terminating Xvfb") |
desktop.x_proc.terminate() |
+ g_desktops = [] |
def reload_config(): |
@@ -663,6 +667,11 @@ def signal_handler(signum, stackframe): |
raise SystemExit |
+def relaunch_self(): |
+ cleanup() |
+ os.execvp(sys.argv[0], sys.argv) |
+ |
+ |
def main(): |
DEFAULT_SIZE = "1280x800" |
parser = optparse.OptionParser( |
@@ -873,32 +882,35 @@ def main(): |
last_launch_time = 0 |
while True: |
- # If the session process stops running (e.g. because the user logged out), |
- # the X server should be reset and the session restarted, to provide a |
- # completely clean new session. |
+ # If the session process or X server stops running (e.g. because the user |
+ # logged out), kill the other. This will trigger the next conditional block |
+ # as soon as the os.wait() call (below) returns. |
if desktop.session_proc is None and desktop.x_proc is not None: |
logging.info("Terminating X server") |
desktop.x_proc.terminate() |
- |
- if desktop.x_proc is None: |
- if desktop.session_proc is not None: |
- # The X session would probably die soon if the X server is not |
- # running (because of the loss of the X connection). Terminate it |
- # anyway, to be sure. |
- logging.info("Terminating X session") |
- desktop.session_proc.terminate() |
- else: |
- # Neither X server nor X session are running. |
- elapsed = time.time() - last_launch_time |
- if elapsed < 60: |
- logging.error("The session lasted less than 1 minute. Waiting " + |
- "before starting new session.") |
- time.sleep(60 - elapsed) |
- |
- logging.info("Launching X server and X session") |
+ elif desktop.x_proc is None and desktop.session_proc is not None: |
+ logging.info("Terminating X session") |
+ desktop.session_proc.terminate() |
+ elif desktop.x_proc is None and desktop.session_proc is None: |
+ # Neither X server nor X session are running. |
+ elapsed = time.time() - last_launch_time |
+ if elapsed < 60: |
+ logging.error("The session lasted less than 1 minute. Waiting " + |
+ "before starting new session.") |
+ time.sleep(60 - elapsed) |
+ |
+ if last_launch_time == 0: |
+ # Neither process has been started yet. Do so now. |
+ logging.info("Launching X server and X session.") |
last_launch_time = time.time() |
desktop.launch_x_server(args) |
desktop.launch_x_session() |
+ else: |
+ # Both processes have terminated. Since the user's desktop is already |
+ # gone at this point, there's no state to lose and now is a good time |
+ # to pick up any updates to this script that might have been installed. |
+ logging.info("Relaunching self") |
+ relaunch_self() |
if desktop.host_proc is None: |
logging.info("Launching host process") |