mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 11:45:37 +00:00
89 lines
2.4 KiB
Python
Executable File
89 lines
2.4 KiB
Python
Executable File
#!/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):
|
|
# Support for both BSD and UNIX syntax
|
|
# `ps aux` returns COMMAND, `ps -ef` returns CMD
|
|
try:
|
|
command = process['COMMAND']
|
|
except KeyError:
|
|
command = process['CMD']
|
|
|
|
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
|