Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(301)

Unified Diff: tools/task_kill.py

Issue 23549002: Add small util for killing hanging processes. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
+ *
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698