Index: tools/task_kill.py |
=================================================================== |
--- tools/task_kill.py (revision 0) |
+++ tools/task_kill.py (revision 0) |
@@ -0,0 +1,172 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+# for details. All rights reserved. Use of this source code is governed by a |
+# BSD-style license that can be found in the LICENSE file. |
+# |
+ |
+# A script to kill hanging processs. The tool will return non-zero if any |
+# process was actually found. |
+# |
+ |
+import optparse |
+import os |
+import signal |
+import shutil |
+import string |
+import subprocess |
+import sys |
+import utils |
+ |
+os_name = utils.GuessOS() |
+ |
+POSIX_INFO = 'ps -p %s -o args' |
+ |
+EXECUTABLE_NAMES = { |
+ 'win32': { 'chrome': 'chrome.exe', 'dart': 'dart.exe', |
+ 'iexplore': 'iexplore.exe', 'firefox': 'firefox.exe'}, |
+ 'linux': { 'chrome': 'chrome', 'dart': 'dart', |
+ 'firefox': 'firefox.exe'}, |
+ 'macos': { 'chrome': 'Chrome', 'dart': 'dart', |
+ 'firefox': 'firefox', 'safari': 'Safari' } |
+} |
+ |
+INFO_COMMAND = { |
+ 'win32': 'wmic process where Processid=%s get CommandLine', |
+ 'macos': POSIX_INFO, |
+ 'linux': POSIX_INFO, |
+} |
+ |
+def GetOptions(): |
+ parser = optparse.OptionParser("usage: %prog [options]") |
+ parser.add_option("--kill_dart", default=True, |
+ help="Kill all dart processes") |
+ parser.add_option("--kill_browsers", default=False, |
+ help="Kill all browser processes") |
+ (options, args) = parser.parse_args() |
+ return options |
+ |
+ |
+def GetPidsPosix(process_name): |
+ # This is to have only one posix command, on linux we could just do: |
+ # pidof process_name |
+ cmd = 'ps -e -o pid=,comm=' |
+ # Sample output: |
+ # 1 /sbin/launchd |
+ # 80943 /Applications/Safari.app/Contents/MacOS/Safari |
+ p = subprocess.Popen(cmd, |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.PIPE, |
+ shell=True) |
+ output, stderr = p.communicate() |
+ results = [] |
+ lines = output.splitlines() |
+ for line in lines: |
+ split = line.split() |
+ # On mac this ps commands actually gives us the full path to non |
+ # system binaries. |
+ if len(split) >= 2 and " ".join(split[1:]).endswith(process_name): |
+ results.append(split[0]) |
+ return results |
+ |
+ |
+def GetPidsWindows(process_name): |
+ cmd = 'tasklist /FI "IMAGENAME eq %s" /NH' % process_name |
+ # Sample output: |
+ # dart.exe 4356 Console 1 6,800 K |
+ p = subprocess.Popen(cmd, |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.PIPE, |
+ shell=True) |
+ output, stderr = p.communicate() |
+ results = [] |
+ lines = output.splitlines() |
+ |
+ for line in lines: |
+ split = line.split() |
+ if len(split) > 2 and split[0] == process_name: |
+ results.append(split[1]) |
+ return results |
+ |
+def GetPids(process_name): |
+ if (os_name == "win32"): |
+ return GetPidsWindows(process_name) |
+ else: |
+ return GetPidsPosix(process_name) |
+ |
+def PrintPidInfo(pid): |
+ # We asume that the list command will return lines in the format: |
+ # EXECUTABLE_PATH ARGS |
+ # There may be blank strings in the output |
+ p = subprocess.Popen(INFO_COMMAND[os_name] % pid, |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.PIPE, |
+ shell=True) |
+ output, stderr = p.communicate() |
+ lines = output.splitlines() |
+ |
+ # Pop the header |
+ lines.pop(0) |
+ for line in lines: |
+ # wmic will output a bunch of empty strings, we ignore these |
+ if len(line) >= 1: |
+ print("Hanging process info:") |
+ print(" PID: %s" % pid) |
+ print(" Command line: %s" % line) |
+ |
+ |
+def KillPosix(pid): |
+ try: |
+ os.kill(int(pid), signal.SIGKILL); |
+ except: |
+ # Ignore this, the process is already dead from killing another process. |
+ pass |
+ |
+def KillWindows(pid): |
+ # os.kill is not available until python 2.7 |
+ cmd = "taskkill /F /PID %s" % pid |
+ p = subprocess.Popen(cmd, |
+ stdout=subprocess.PIPE, |
+ stderr=subprocess.PIPE, |
+ shell=True) |
+ p.communicate() |
+ |
+def Kill(name): |
+ if (name not in EXECUTABLE_NAMES[os_name]): |
+ return 0 |
+ print("***************** Killing %s *****************" % name) |
+ platform_name = EXECUTABLE_NAMES[os_name][name] |
+ pids = GetPids(platform_name) |
+ for pid in pids: |
+ PrintPidInfo(pid); |
+ if (os_name == "win32"): |
+ KillWindows(pid) |
+ else: |
+ KillPosix(pid) |
+ print("Killed pid: %s" % pid) |
+ if (len(pids) == 0): |
+ print(" No %s processes found." % name) |
+ return len(pids) |
+ |
+def KillBrowsers(): |
+ status = Kill('firefox') |
+ status += Kill('chrome') |
+ status += Kill('iexplore') |
+ status += Kill('safari') |
+ return status |
+ |
+def KillDart(): |
+ status = Kill("dart") |
+ return status |
+ |
+def Main(): |
+ options = GetOptions() |
+ status = 0 |
+ if (options.kill_dart): |
+ status += KillDart(); |
+ if (options.kill_browsers): |
+ status += KillBrowsers() |
+ return status |
+ |
+if __name__ == '__main__': |
+ sys.exit(Main()) |
Property changes on: tools/task_kill.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |
Added: svn:executable |
+ * |