Chromium Code Reviews| Index: tools/task_kill.py |
| =================================================================== |
| --- tools/task_kill.py (revision 0) |
| +++ tools/task_kill.py (revision 0) |
| @@ -0,0 +1,171 @@ |
| +#!/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', |
|
kustermann
2013/08/27 12:33:14
Don't you need to quote this 'where Processid='?
|
| + '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) |
|
kustermann
2013/08/27 12:33:14
if you do this, you have to do
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(" Nothing to kill") |
|
kustermann
2013/08/27 12:33:14
"Nothing to kill" -> "No %s processes found." % na
|
| + 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 = status + KillBrowsers() |
|
kustermann
2013/08/27 12:33:14
+= instead
|
| + return status |
| + |
| +if __name__ == '__main__': |
| + sys.exit(Main()) |
| Property changes on: tools/task_kill.py |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |
| Added: svn:executable |
| + * |