Line | |
---|
1 | #!/usr/bin/python
|
---|
2 |
|
---|
3 | import sys
|
---|
4 | import time
|
---|
5 |
|
---|
6 | pids={}
|
---|
7 |
|
---|
8 | def parse_execve(syscall):
|
---|
9 | i=syscall.find('"')
|
---|
10 | if i<0:
|
---|
11 | return None
|
---|
12 | name=syscall[i+1:]
|
---|
13 | i=name.find('"')
|
---|
14 | if i<0:
|
---|
15 | return None
|
---|
16 | name=name[:i]
|
---|
17 | return name
|
---|
18 |
|
---|
19 | def parse_exit(syscall):
|
---|
20 | i=syscall.find(',')
|
---|
21 | retcode=syscall[len('_exit('):i]
|
---|
22 | return retcode
|
---|
23 |
|
---|
24 | def parse_waitpid(syscall):
|
---|
25 | i=syscall.rfind('=')
|
---|
26 | if i<0:
|
---|
27 | return None
|
---|
28 | else:
|
---|
29 | pid=syscall[i+1:].strip()
|
---|
30 | pid=pid.split(' ')[0]
|
---|
31 | return pid
|
---|
32 |
|
---|
33 | def process_syscall(pid,t,syscall):
|
---|
34 | if syscall.startswith('execve') and not "ENOENT" in syscall:
|
---|
35 | name=parse_execve(syscall)
|
---|
36 | i=name.rfind('/')
|
---|
37 | if i>0:
|
---|
38 | name=name[i+1:]
|
---|
39 | pids[pid]=[ name,t ]
|
---|
40 | elif syscall.startswith('_exit'):
|
---|
41 | if pids.has_key(pid):
|
---|
42 | name,start=pids[pid]
|
---|
43 | pids[pid]=[ name,start,t ]
|
---|
44 | elif 'waitpid' in syscall:
|
---|
45 | pid=parse_waitpid(syscall)
|
---|
46 | if pids.has_key(pid):
|
---|
47 | name,start=pids[pid]
|
---|
48 | pids[pid]=[ name,start,t]
|
---|
49 |
|
---|
50 | if __name__=="__main__":
|
---|
51 | for l in sys.stdin.readlines():
|
---|
52 | parts=l.split(" ")
|
---|
53 | pid=parts[0]
|
---|
54 | t=parts[1]
|
---|
55 | syscall=''.join(parts[2:])
|
---|
56 |
|
---|
57 | process_syscall(pid,t,syscall)
|
---|
58 |
|
---|
59 |
|
---|
60 | for p in sorted(pids):
|
---|
61 | tup=pids[p]
|
---|
62 | if len(tup)==2:
|
---|
63 | name,start=tup
|
---|
64 | print name+"*",start,start
|
---|
65 | else:
|
---|
66 | name,start,end=tup
|
---|
67 | print name,start,end
|
---|
Note:
See
TracBrowser
for help on using the repository browser.