OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # |
| 3 # $Id: process_detail.py 1143 2011-10-05 19:11:59Z g.rodola $ |
| 4 # |
| 5 # Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved. |
| 6 # Use of this source code is governed by a BSD-style license that can be |
| 7 # found in the LICENSE file. |
| 8 |
| 9 """ |
| 10 Print detailed information about a process. |
| 11 """ |
| 12 |
| 13 import os |
| 14 import datetime |
| 15 import socket |
| 16 import sys |
| 17 |
| 18 import psutil |
| 19 from psutil._compat import namedtuple |
| 20 |
| 21 |
| 22 def convert_bytes(n): |
| 23 if n == 0: |
| 24 return '0B' |
| 25 symbols = ('k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') |
| 26 prefix = {} |
| 27 for i, s in enumerate(symbols): |
| 28 prefix[s] = 1 << (i+1)*10 |
| 29 for s in reversed(symbols): |
| 30 if n >= prefix[s]: |
| 31 value = float(n) / prefix[s] |
| 32 return '%.1f%s' % (value, s) |
| 33 |
| 34 def print_(a, b): |
| 35 if sys.stdout.isatty(): |
| 36 fmt = '\x1b[1;32m%-17s\x1b[0m %s' %(a, b) |
| 37 else: |
| 38 fmt = '%-15s %s' %(a, b) |
| 39 print fmt |
| 40 |
| 41 def run(pid): |
| 42 p = psutil.Process(pid) |
| 43 if p.parent: |
| 44 parent = '(%s)' % p.parent.name |
| 45 else: |
| 46 parent = '' |
| 47 started = datetime.datetime.fromtimestamp(p.create_time).strftime('%Y-%M-%d
%H:%M') |
| 48 io = p.get_io_counters() |
| 49 mem = p.get_memory_info() |
| 50 mem = '%s%% (resident=%s, virtual=%s) ' %(round(p.get_memory_percent(), 1), |
| 51 convert_bytes(mem.rss), |
| 52 convert_bytes(mem.vms)) |
| 53 cpu_times = p.get_cpu_times() |
| 54 cpu_percent = p.get_cpu_percent(0) |
| 55 children = p.get_children() |
| 56 files = p.get_open_files() |
| 57 threads = p.get_threads() |
| 58 connections = p.get_connections() |
| 59 |
| 60 print_('pid', p.pid) |
| 61 print_('name', p.name) |
| 62 print_('exe', p.exe) |
| 63 print_('parent', '%s %s' % (p.ppid, parent)) |
| 64 print_('cmdline', ' '.join(p.cmdline)) |
| 65 print_('started', started) |
| 66 print_('user', p.username) |
| 67 if os.name == 'posix': |
| 68 print_('uids', 'real=%s, effective=%s, saved=%s' % p.uids) |
| 69 print_('gids', 'real=%s, effective=%s, saved=%s' % p.gids) |
| 70 print_('terminal', p.terminal or '') |
| 71 if hasattr(p, 'getcwd'): |
| 72 print_('cwd', p.getcwd()) |
| 73 print_('memory', mem) |
| 74 print_('cpu', '%s%% (user=%s, system=%s)' % (cpu_percent, |
| 75 cpu_times.user, |
| 76 cpu_times.system)) |
| 77 print_('status', p.status) |
| 78 print_('niceness', p.nice) |
| 79 print_('num threads', p.get_num_threads()) |
| 80 if hasattr(p, 'get_io_counters'): |
| 81 print_('I/O', 'bytes-read=%s, bytes-written=%s' % \ |
| 82 (convert_bytes(io.read_bytes), |
| 83 convert_bytes(io.write_bytes))) |
| 84 if children: |
| 85 print_('children', '') |
| 86 for child in children: |
| 87 print_('', 'pid=%s name=%s' % (child.pid, child.name)) |
| 88 |
| 89 if files: |
| 90 print_('open files', '') |
| 91 for file in files: |
| 92 print_('', 'fd=%s %s ' % (file.fd, file.path)) |
| 93 |
| 94 if threads: |
| 95 print_('running threads', '') |
| 96 for thread in threads: |
| 97 print_('', 'id=%s, user-time=%s, sys-time=%s' \ |
| 98 % (thread.id, thread.user_time, thread.system_time)) |
| 99 if connections: |
| 100 print_('open connections', '') |
| 101 for conn in connections: |
| 102 type = 'TCP' if conn.type == socket.SOCK_STREAM else 'UDP' |
| 103 lip, lport = conn.local_address |
| 104 if not conn.remote_address: |
| 105 rip, rport = '*', '*' |
| 106 else: |
| 107 rip, rport = conn.remote_address |
| 108 print_('', '%s:%s -> %s:%s type=%s status=%s' \ |
| 109 % (lip, lport, rip, rport, type, conn.status)) |
| 110 |
| 111 def main(argv=None): |
| 112 if argv is None: |
| 113 argv = sys.argv |
| 114 if len(argv) == 1: |
| 115 sys.exit(run(os.getpid())) |
| 116 elif len(argv) == 2: |
| 117 sys.exit(run(int(argv[1]))) |
| 118 else: |
| 119 sys.exit('usage: %s [pid]' % __file__) |
| 120 |
| 121 if __name__ == '__main__': |
| 122 sys.exit(main()) |
OLD | NEW |