如何查找/杀死特定的python程序

Chr*_*ris 6 linux bash grep ps

此 VM 中运行着两个不同的 Python 程序

一个是监控文件夹然后“做事”的后台工作(有几个工人)

10835 ?        Sl     0:03 python main.py
10844 ?        Sl    34:02 python main.py
10845 ?        S     33:43 python main.py
Run Code Online (Sandbox Code Playgroud)

第二个是通过脚本启动的

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
Run Code Online (Sandbox Code Playgroud)

我尝试了很多方法来找到只杀死主程序的方法(我想构建一个 cron 看门狗),但没有成功

第一个我只想找到挂起的“python main.py”进程(伴随着 [defunct]),但我什至无法单独找到这个进程。

上面的来自 ps -ax(所以它们当前都在运行) pgrep 'python' 返回所有 PID,也来自我不想要的 second.py :(没有用,因此 pkill 也是如此)

pgrep 'python'
10835
10844
10845
20087
Run Code Online (Sandbox Code Playgroud)

pgrep 'python main.py' 总是返回空, pgrep 'main.py 也是如此;

唯一有效的东西

ps ax | grep 'python main.py'
Run Code Online (Sandbox Code Playgroud)

但是这个也返回它自己的PID,grepping 'ps' 不是一个首选的解决方案。当 main.py 挂起时,它显示“python main.py [defunct]”。一种

ps ax | grep 'python main.py [defunct]'
Run Code Online (Sandbox Code Playgroud)

作为测试没有用,因为它总是返回 true。除了 'python' 以外的任何东西的 pgrep 也总是返回 false。我有点不知所措。

irb*_*ana 5

这对我有用。在pgrep 兄弟页面上找到它。

以“test.py”为参数查找进程的pid,例如“python test.py”

pgrep -f test.py
Run Code Online (Sandbox Code Playgroud)

我用它来检查 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
Run Code Online (Sandbox Code Playgroud)


Pav*_*hov 3

在你的守护进程 python 脚本中,你应该创建 PID 文件:

def writePidFile():
  pid = str(os.getpid())
  f = open('/tmp/my_pid', 'w')
  f.write(pid)
  f.close()
Run Code Online (Sandbox Code Playgroud)

现在杀死这个进程很简单:

kill `cat /tmp/my_pid`
Run Code Online (Sandbox Code Playgroud)

或者你可以只使用grep和过滤它自己的进程:

ps ax | grep 'python main.py [defunct]' | grep -v grep
Run Code Online (Sandbox Code Playgroud)