Advertisement
Mr_hEx

pspy python with python standard libraries

Jun 28th, 2023 (edited)
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. # tested with python3 only !!
  2. import os
  3. import time
  4. import pwd
  5. from datetime import datetime
  6. import threading
  7.  
  8. def get_process_info(pid):
  9. try:
  10. with open(f"/proc/{pid}/status") as f:
  11. status_data = f.read()
  12. with open(f"/proc/{pid}/cmdline") as f:
  13. cmdline_data = f.read().replace("\0", " ").strip()
  14.  
  15. status_lines = status_data.splitlines()
  16. process_info = {"pid": pid}
  17.  
  18. for line in status_lines:
  19. if line.startswith("Name:"):
  20. process_info["name"] = line.split(":", 1)[1].strip()
  21. elif line.startswith("Uid:"):
  22. uid = int(line.split(":", 1)[1].strip().split()[0])
  23. process_info["username"] = pwd.getpwuid(uid).pw_name
  24.  
  25. process_info["cmdline"] = cmdline_data
  26. return process_info
  27.  
  28. except FileNotFoundError:
  29. return None
  30.  
  31. def get_current_processes():
  32. process_list = []
  33. try:
  34. for pid in os.listdir("/proc"):
  35. if pid.isdigit():
  36. process_info = get_process_info(pid)
  37. if process_info:
  38. process_list.append(process_info)
  39. except:
  40. return 0
  41.  
  42. return process_list
  43.  
  44. def check_new_processes(prev_processes, current_processes):
  45. new_processes = [p for p in current_processes if p not in prev_processes]
  46. return new_processes
  47.  
  48. def print_process(process_info):
  49. current_time = datetime.now().strftime("%H:%M:%S")
  50. print(
  51. f"{current_time} "
  52. f"{process_info['pid']:<6} "
  53. f"{process_info['username']:<10} "
  54. f"{process_info['name']:<30} "
  55. f"{process_info['cmdline']:<60}"
  56. )
  57.  
  58. def worker_thread():
  59. global prev_processes
  60. global stop_threads
  61. while not stop_threads:
  62. current_processes = get_current_processes()
  63. if current_processes == 0:
  64. pass
  65. else:
  66. new_processes = check_new_processes(prev_processes, current_processes)
  67.  
  68. if new_processes:
  69. for new_process in new_processes:
  70. print_process(new_process)
  71.  
  72. prev_processes = current_processes
  73. time.sleep(0.0001)
  74.  
  75. if __name__ == "__main__":
  76. try:
  77. print(f"{'TIME':<19} {'PID':<6} {'USER':<10} {'NAME':<30} {'CMDLINE':<60}")
  78. print("-" * 125)
  79.  
  80. global prev_processes
  81. global stop_threads
  82. stop_threads = False
  83.  
  84. prev_processes = get_current_processes()
  85. for process in prev_processes:
  86. print_process(process)
  87.  
  88. worker = threading.Thread(target=worker_thread)
  89. worker.start()
  90.  
  91. except KeyboardInterrupt:
  92. print("\nProcess monitor stopped.")
  93. stop_threads = True
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement