| #!/usr/bin/env python |
| |
| # This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| # You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| import os |
| import mozinfo |
| import shlex |
| import subprocess |
| import sys |
| |
| # determine the platform-specific invocation of `ps` |
| if mozinfo.isMac: |
| psarg = '-Acj' |
| elif mozinfo.isLinux: |
| psarg = 'axwww' |
| else: |
| psarg = 'ax' |
| |
| def ps(arg=psarg): |
| """ |
| python front-end to `ps` |
| http://en.wikipedia.org/wiki/Ps_%28Unix%29 |
| returns a list of process dicts based on the `ps` header |
| """ |
| retval = [] |
| process = subprocess.Popen(['ps', arg], stdout=subprocess.PIPE) |
| stdout, _ = process.communicate() |
| header = None |
| for line in stdout.splitlines(): |
| line = line.strip() |
| if header is None: |
| # first line is the header |
| header = line.split() |
| continue |
| split = line.split(None, len(header)-1) |
| process_dict = dict(zip(header, split)) |
| retval.append(process_dict) |
| return retval |
| |
| def running_processes(name, psarg=psarg, defunct=True): |
| """ |
| returns a list of |
| {'PID': PID of process (int) |
| 'command': command line of process (list)} |
| with the executable named `name`. |
| - defunct: whether to return defunct processes |
| """ |
| retval = [] |
| for process in ps(psarg): |
| command = process['COMMAND'] |
| command = shlex.split(command) |
| if command[-1] == '<defunct>': |
| command = command[:-1] |
| if not command or not defunct: |
| continue |
| if 'STAT' in process and not defunct: |
| if process['STAT'] == 'Z+': |
| continue |
| prog = command[0] |
| basename = os.path.basename(prog) |
| if basename == name: |
| retval.append((int(process['PID']), command)) |
| return retval |
| |
| def get_pids(name): |
| """Get all the pids matching name""" |
| |
| if mozinfo.isWin: |
| # use the windows-specific implementation |
| import wpk |
| return wpk.get_pids(name) |
| else: |
| return [pid for pid,_ in running_processes(name)] |
| |
| if __name__ == '__main__': |
| pids = set() |
| for i in sys.argv[1:]: |
| pids.update(get_pids(i)) |
| for i in sorted(pids): |
| print i |