#!/usr/bin/python import os import subprocess import signal from launcher import Launcher launcher = Launcher() def find_cmd (cmd_list): """ Takes a list of command candidates and returns the first one that exists. Raises a system exit if none of the commands exist. """ for cmd in cmd_list: if os.path.exists(cmd): return cmd raise SystemExit("None of the commands %s exist" % cmd_list) try: # Kill gnome-panel in a way that it won't autorespawn pidof_cmd = find_cmd(["/sbin/pidof", "/bin/pidof", "/usr/bin/pidof"]) pidof = subprocess.Popen([pidof_cmd, "gnome-panel"], stdout=subprocess.PIPE) pids = pidof.communicate()[0].split() pidof.wait() devnull = open("/dev/null", "w") for pid in pids: if launcher.is_verbose(): print "Terminating panel process %s" % pid subprocess.call(["gdb", "-batch-silent", "-ex", "call panel_session_do_not_restart()", "-ex", "call exit(0)", "-p", pid], stdout=devnull, stderr=devnull) devnull.close() if launcher.is_verbose(): print "Starting shell" shell = launcher.start_shell() # Wait for shell to exit try: if launcher.is_verbose(): print "Waiting for shell to exit" shell.wait() if launcher.is_verbose(): print "Shell is dead" except KeyboardInterrupt, e: os.kill(shell.pid, signal.SIGKILL) shell.wait() if launcher.is_verbose(): print "Shell killed" finally: # Restart gnome-panel and window manager if launcher.is_verbose(): print "Restarting Metacity and Gnome Panel" subprocess.Popen(["/usr/bin/metacity"]) subprocess.Popen(["/usr/bin/gnome-panel"])