431
+ − 1 #!/usr/bin/env python
+ − 2
+ − 3 """
+ − 4 attach strace to a process:
+ − 5
+ − 6 624 sudo strace -p $(pidof firefox)
+ − 7 625 kill 6976
+ − 8 626 isrunning firefox
+ − 9
+ − 10 Optionally kill the process when detached
+ − 11 """
+ − 12
+ − 13
+ − 14 import optparse
+ − 15 import os
+ − 16 import subprocess
+ − 17 import sys
+ − 18
+ − 19 from subprocess import check_output
+ − 20
+ − 21 def main(args=sys.argv[1:]):
+ − 22
+ − 23 usage = '%prog [options] ProgramName_or_PID'
+ − 24 parser = optparse.OptionParser(usage=usage, description=__doc__)
+ − 25 parser.add_option('-k', '--kill',
+ − 26 action='store_true', default=False,
+ − 27 help="kill process after strace is done")
+ − 28 options, args = parser.parse_args(args)
+ − 29 if len(args) != 1:
+ − 30 parser.print_usage()
+ − 31 parser.error("Please specify program or PID to attach to")
+ − 32
+ − 33 # get the PID
+ − 34 try:
+ − 35 pid = int(args[0])
+ − 36 except ValueError:
+ − 37 pid = check_output(["pidof", args[0]]).strip().split()
+ − 38 if len(pid) > 1:
+ − 39 parser.error("Multiple PIDs found for %s:\n%s" % (args[0],
+ − 40 '\n'.join(pid)))
+ − 41 # TODO: handle not matching case
+ − 42 pid = int(pid[0])
+ − 43
+ − 44 # invoke strace
+ − 45 subprocess.call(['sudo', 'strace', '-p', str(pid)])
+ − 46
+ − 47 # kill if specified
+ − 48 os.kill(pid, 9) # TODO: better than SIGKILL
+ − 49
+ − 50 if __name__ == '__main__':
+ − 51 main()