| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # | 2 # |
| 3 # Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 3 # Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 4 # for details. All rights reserved. Use of this source code is governed by a | 4 # for details. All rights reserved. Use of this source code is governed by a |
| 5 # BSD-style license that can be found in the LICENSE file. | 5 # BSD-style license that can be found in the LICENSE file. |
| 6 # | 6 # |
| 7 | 7 |
| 8 # A script to kill hanging processs. The tool will return non-zero if any | 8 # A script to kill hanging processs. The tool will return non-zero if any |
| 9 # process was actually found. | 9 # process was actually found. |
| 10 # | 10 # |
| 11 | 11 |
| 12 import optparse | 12 import optparse |
| 13 import os | 13 import os |
| 14 import signal | 14 import signal |
| 15 import shutil | |
| 16 import string | |
| 17 import subprocess | 15 import subprocess |
| 18 import sys | 16 import sys |
| 17 |
| 19 import utils | 18 import utils |
| 20 | 19 |
| 20 |
| 21 os_name = utils.GuessOS() | 21 os_name = utils.GuessOS() |
| 22 | 22 |
| 23 POSIX_INFO = 'ps -p %s -o args' | 23 POSIX_INFO = 'ps -p %s -o args' |
| 24 | 24 |
| 25 EXECUTABLE_NAMES = { | 25 EXECUTABLE_NAMES = { |
| 26 'win32': { | 26 'win32': { |
| 27 'chrome': 'chrome.exe', | 27 'chrome': 'chrome.exe', |
| 28 'content_shell': 'content_shell.exe', | 28 'content_shell': 'content_shell.exe', |
| 29 'dart': 'dart.exe', | 29 'dart': 'dart.exe', |
| 30 'editor': 'DartEditor.exe', | 30 'editor': 'DartEditor.exe', |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 results = [] | 111 results = [] |
| 112 lines = output.splitlines() | 112 lines = output.splitlines() |
| 113 | 113 |
| 114 for line in lines: | 114 for line in lines: |
| 115 split = line.split() | 115 split = line.split() |
| 116 if len(split) > 2 and split[0] == process_name: | 116 if len(split) > 2 and split[0] == process_name: |
| 117 results.append(split[1]) | 117 results.append(split[1]) |
| 118 return results | 118 return results |
| 119 | 119 |
| 120 def GetPids(process_name): | 120 def GetPids(process_name): |
| 121 if (os_name == "win32"): | 121 if os_name == "win32": |
| 122 return GetPidsWindows(process_name) | 122 return GetPidsWindows(process_name) |
| 123 else: | 123 else: |
| 124 return GetPidsPosix(process_name) | 124 return GetPidsPosix(process_name) |
| 125 | 125 |
| 126 def PrintPidInfo(pid): | 126 def PrintPidInfo(pid): |
| 127 # We asume that the list command will return lines in the format: | 127 # We assume that the list command will return lines in the format: |
| 128 # EXECUTABLE_PATH ARGS | 128 # EXECUTABLE_PATH ARGS |
| 129 # There may be blank strings in the output | 129 # There may be blank strings in the output |
| 130 p = subprocess.Popen(INFO_COMMAND[os_name] % pid, | 130 p = subprocess.Popen(INFO_COMMAND[os_name] % pid, |
| 131 stdout=subprocess.PIPE, | 131 stdout=subprocess.PIPE, |
| 132 stderr=subprocess.PIPE, | 132 stderr=subprocess.PIPE, |
| 133 shell=True) | 133 shell=True) |
| 134 output, stderr = p.communicate() | 134 output, stderr = p.communicate() |
| 135 lines = output.splitlines() | 135 lines = output.splitlines() |
| 136 | 136 |
| 137 # Pop the header | 137 # Pop the header |
| 138 lines.pop(0) | 138 lines.pop(0) |
| 139 for line in lines: | 139 for line in lines: |
| 140 # wmic will output a bunch of empty strings, we ignore these | 140 # wmic will output a bunch of empty strings, we ignore these |
| 141 if len(line) >= 1: | 141 if len(line) >= 1: |
| 142 print("Hanging process info:") | 142 print("Hanging process info:") |
| 143 print(" PID: %s" % pid) | 143 print(" PID: %s" % pid) |
| 144 print(" Command line: %s" % line) | 144 print(" Command line: %s" % line) |
| 145 | 145 |
| 146 | 146 |
| 147 def KillPosix(pid): | 147 def KillPosix(pid): |
| 148 try: | 148 try: |
| 149 os.kill(int(pid), signal.SIGKILL); | 149 os.kill(int(pid), signal.SIGKILL) |
| 150 except: | 150 except: |
| 151 # Ignore this, the process is already dead from killing another process. | 151 # Ignore this, the process is already dead from killing another process. |
| 152 pass | 152 pass |
| 153 | 153 |
| 154 def KillWindows(pid): | 154 def KillWindows(pid): |
| 155 # os.kill is not available until python 2.7 | 155 # os.kill is not available until python 2.7 |
| 156 cmd = "taskkill /F /PID %s" % pid | 156 cmd = "taskkill /F /PID %s" % pid |
| 157 p = subprocess.Popen(cmd, | 157 p = subprocess.Popen(cmd, |
| 158 stdout=subprocess.PIPE, | 158 stdout=subprocess.PIPE, |
| 159 stderr=subprocess.PIPE, | 159 stderr=subprocess.PIPE, |
| 160 shell=True) | 160 shell=True) |
| 161 p.communicate() | 161 p.communicate() |
| 162 | 162 |
| 163 def Kill(name): | 163 def Kill(name): |
| 164 if (name not in EXECUTABLE_NAMES[os_name]): | 164 if name not in EXECUTABLE_NAMES[os_name]: |
| 165 return 0 | 165 return 0 |
| 166 print("***************** Killing %s *****************" % name) | 166 print("***************** Killing %s *****************" % name) |
| 167 platform_name = EXECUTABLE_NAMES[os_name][name] | 167 platform_name = EXECUTABLE_NAMES[os_name][name] |
| 168 pids = GetPids(platform_name) | 168 pids = GetPids(platform_name) |
| 169 for pid in pids: | 169 for pid in pids: |
| 170 PrintPidInfo(pid); | 170 PrintPidInfo(pid) |
| 171 if (os_name == "win32"): | 171 if os_name == "win32": |
| 172 KillWindows(pid) | 172 KillWindows(pid) |
| 173 else: | 173 else: |
| 174 KillPosix(pid) | 174 KillPosix(pid) |
| 175 print("Killed pid: %s" % pid) | 175 print("Killed pid: %s" % pid) |
| 176 if (len(pids) == 0): | 176 if len(pids) == 0: |
| 177 print(" No %s processes found." % name) | 177 print(" No %s processes found." % name) |
| 178 return len(pids) | 178 return len(pids) |
| 179 | 179 |
| 180 def KillBrowsers(): | 180 def KillBrowsers(): |
| 181 status = Kill('firefox') | 181 status = Kill('firefox') |
| 182 status += Kill('chrome') | 182 status += Kill('chrome') |
| 183 status += Kill('iexplore') | 183 status += Kill('iexplore') |
| 184 status += Kill('safari') | 184 status += Kill('safari') |
| 185 status += Kill('content_shell') | 185 status += Kill('content_shell') |
| 186 return status | 186 return status |
| (...skipping 11 matching lines...) Expand all Loading... |
| 198 status = Kill("editor") | 198 status = Kill("editor") |
| 199 if os_name == "linux": | 199 if os_name == "linux": |
| 200 # it is important to kill java after editor on linux | 200 # it is important to kill java after editor on linux |
| 201 status += Kill("java") | 201 status += Kill("java") |
| 202 status += Kill("eggplant") | 202 status += Kill("eggplant") |
| 203 return status | 203 return status |
| 204 | 204 |
| 205 def Main(): | 205 def Main(): |
| 206 options = GetOptions() | 206 options = GetOptions() |
| 207 status = 0 | 207 status = 0 |
| 208 if (options.kill_dart): | 208 if options.kill_dart: |
| 209 status += KillDart(); | 209 status += KillDart() |
| 210 if (options.kill_vc): | 210 if options.kill_vc: |
| 211 status += KillVCSystems(); | 211 status += KillVCSystems() |
| 212 if (options.kill_browsers): | 212 if options.kill_browsers: |
| 213 status += KillBrowsers() | 213 status += KillBrowsers() |
| 214 if (options.kill_editor): | 214 if options.kill_editor: |
| 215 status += KillEditor() | 215 status += KillEditor() |
| 216 return status | 216 return status |
| 217 | 217 |
| 218 if __name__ == '__main__': | 218 if __name__ == '__main__': |
| 219 sys.exit(Main()) | 219 sys.exit(Main()) |
| OLD | NEW |