1. import psutil
  2. import os
  3. import signal
  4. import time
  5. import argparse
  6. def find_processes_in_directory(directory):
  7. """Finds all running processes associated with a directory."""
  8. processes = []
  9. for proc in psutil.process_iter(['pid', 'name', 'exe', 'cwd']):
  10. try:
  11. if proc.info['cwd'] == os.path.abspath(directory):
  12. processes.append(proc)
  13. except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  14. pass
  15. return processes
  16. def kill_processes_in_directory(directory, dry_run=True):
  17. """Kills processes in a directory. Dry-run mode prevents actual termination."""
  18. processes = find_processes_in_directory(directory)
  19. if not processes:
  20. print(f"No processes found in directory: {directory}")
  21. return
  22. if dry_run:
  23. print(f"Dry-run: Would kill the following processes in {directory}:")
  24. for proc in processes:
  25. print(f" PID: {proc.info['pid']}, Name: {proc.info['name']}, Executable: {proc.info['exe']}")
  26. else:
  27. print(f"Killing processes in {directory}:")
  28. for proc in processes:
  29. try:
  30. proc.kill() # Terminate the process
  31. print(f" Killed PID: {proc.info['pid']}")
  32. except psutil.NoSuchProcess:
  33. print(f" Process {proc.info['pid']} already gone.")
  34. except psutil.AccessDenied:
  35. print(f" Access denied to kill process {proc.info['pid']}.")
  36. except psutil.ZombieProcess:
  37. print(f" Process {proc.info['pid']} is a zombie.")
  38. def main():
  39. """Main function to handle command-line arguments and execute."""
  40. parser = argparse.ArgumentParser(description="Teardown processes in a directory (dry-run or real).")
  41. parser.add_argument("directory", help="The directory to teardown processes from.")
  42. parser.add_argument("-r", "--real", action="store_true", help="Execute in real mode (kill processes).")
  43. parser.add_argument("-n", "--dry-run", action="store_false", dest="real", help="Execute in dry-run mode.")
  44. args = parser.parse_args()
  45. directory = args.directory
  46. real_mode = args.real
  47. if not os.path.isdir(directory):
  48. print(f"Error: {directory} is not a valid directory.")
  49. return
  50. kill_processes_in_directory(directory, dry_run=not real_mode)
  51. if __name__ == "__main__":
  52. main()

Add your comment