我试图获取并杀死同一个脚本的所有其他正在运行的python实例,我找到了一个边缘情况,其中路径不在psutil
的cmdline
列表中,当进程启动时使用./myscript.py
而不是python ./myscript.py
脚本的内容是,请注意shebang:
#!/bin/python
import os
import psutil
import sys
import time
for proc in psutil.process_iter():
if "python" in proc.name():
print("name", proc.name())
script_path = sys.argv[0]
proc_script_path = sys.argv[0]
if len(proc.cmdline()) > 1:
proc_script_path = proc.cmdline()[1]
else:
print("there's no path in cmdline")
if script_path.startswith("." + os.sep) or script_path.startswith(".." + os.sep):
script_path = os.path.normpath(os.path.join(os.getcwd(), script_path))
if proc_script_path.startswith("." + os.sep) or proc_script_path.startswith(".." + os.sep):
proc_script_path = os.path.normpath(os.path.join(proc.cwd(), proc_script_path))
print("script_path", script_path)
print("proc_script_path", proc_script_path)
print("my pid", os.getpid())
print("other pid", proc.pid)
if script_path == proc_script_path and os.getpid() != proc.pid:
print("terminating instance ", proc.pid)
proc.kill()
time.sleep(300)
当调用这样的python脚本时,检查if 'python' in proc.name()
就是问题所在。这不会显示有问题的脚本的python或python3,但会显示脚本名称。请尝试以下方法:
import psutil
for proc in proc.process_iter():
print('Script name: {}, cmdline: {}'.format(proc.name(), proc.cmdline()))
你应该看到类似()的东西:Script name: myscript.py, cmdline: ['/usr/bin/python3', './myscript.py']
希望这可以帮助。
当这个过程以./relative/or/absolute/path/to/script.py
而不是python /relative/or/absolute/path/to/script.py
开始时,psutil.Process.name()
是script.py
而不是python
。
要获取运行script.py
的进程路径列表:
ps -eo pid,args|awk '/script.py/ && $2 != "awk" {print}'
获取运行script.py的进程路径列表,路径中没有psutil。在以下脚本中替换您的script.py
和psutil
。
ps -eo pid,args|awk '! /psutil/ && /script.py/ && $2 != "awk" {print}'
ps -eo pid,args
列出所有进程,提供进程ID和进程路径(args)
! /psutil/
匹配路径中没有psutil的所有进程路径。
&& /script.py/
并匹配路径中具有script.py的所有进程路径。
&& $2 != "awk"
并不想要这个awk进程。
{print}
输出匹配的线。