有两个不同的python程序在这个VM中运行
一个是后台工作,它监视一个文件夹,然后'做事情'(与几个工人)
10835 ? Sl 0:03 python main.py
10844 ? Sl 34:02 python main.py
10845 ? S 33:43 python main.py
第二个是通过script
启动的20056 pts/1 S+ 0:00 /bin/bash ./exp.sh
20069 pts/1 S+ 0:00 /bin/bash ./exp.sh
20087 pts/1 S+ 0:10 python /home/path/second.py
我已经尝试了很多事情来找到一种方法来杀死主程序(我想建立一个cron看门狗),但不成功
第一个我只想找到挂起的'python main.py'进程(伴随着[defunct]),但是我甚至不能找到这个进程。
上面的来自ps -ax(所以它们目前都在运行)pgrep 'python'返回所有pid,也来自second.py,这是我不想要的:(无用,因此pkill也是如此)
pgrep 'python'
10835
10844
10845
20087
pgrep 'python main.py'总是返回空,pgrep 'main.py;
唯一有效的方法
ps ax | grep 'python main.py'
,但这个也返回它自己的PID, grepping 'ps'不是一个首选的解决方案。当main.py挂起时,它显示"python main.py [defunct]"。
ps ax | grep 'python main.py [defunct]'
作为测试是无用的,因为它总是返回true。对于大于'python'的Pgrep也总是返回false。我有点笨。
这对我有用。在pgrep
兄弟网页上找到的
查找以'test.py'为参数的进程的pid,如'python test.py'
pgrep -f test.py
我用它来检查python进程是否正在运行:
searcher="backend/webapi.py"
if pgrep -f "$searcher" > /dev/null
then
echo "$(date +%y-%m-%d-%H-%M-%S) $searcher is alive. Doing nothing."
else
echo "No $searcher. Kickstarting..."
pushd $HOME/there/;
./run_backend
popd;
echo "Pgrepping $searcher:"
pgrep "$searcher" # out to loggers
fi
在python守护程序脚本中创建PID文件:
def writePidFile():
pid = str(os.getpid())
f = open('/tmp/my_pid', 'w')
f.write(pid)
f.close()
终止这个进程很简单:
kill `cat /tmp/my_pid`
或者您可以使用grep
并过滤它自己的过程:
ps ax | grep 'python main.py [defunct]' | grep -v grep
我认为我已经找到了一种非常安全的方法,可以仅为特定文件找到适当的python进程PID。这个想法是找到所有的python进程,然后是所有的"test.py"进程,并将结果相交以找到正确的PID。
我在python脚本中使用subprocess模块(您可以为.sh脚本插入):
import subprocess as subp
#Get a list of all processes with a certain name
def get_pid(name):
return list(map(int,subp.check_output(["pidof", "-c", name]).split()))
#Get a list of all pids for python3 processes
python_pids = get_pid('python3')
#Get a list of all pids for processes with "main.py" argument
main_py_pids = list(map(int,subp.check_output(["pgrep", "-f", "main.py"]).split()))
python_main_py_pid = set(python_pids).intersection(main_py_pids)
print(python_pids)
print(main_py_pids)
print(python_main_py_pid)
运行3个python进程(包括这个脚本中的进程)和一个"sudo nano main.py"进程的结果:
Python pids: [3032, 2329, 1698]
main.py pids: [1698, 3031]
Interesection: {1698}