如何杀死bash脚本以及bash脚本中启动的python程序?

问题描述 投票:0回答:1

我使用

nohup
和 bash 脚本来帮助管理在本地服务器上运行的 python 程序。我有一个 bash 脚本(
tmp.sh
)来连续调用多个 python 程序。我尝试终止 bash 脚本以及在 bash 脚本中使用
kill $PID
启动的 python 脚本,其中
PID
是命令
nohup bash tmp.sh &
的进程 ID,但只有 bash 脚本被终止,而 python 脚本继续运行。我不想导出这些 python 脚本的进程 ID,因为 bash 脚本将在其中运行多个 python 脚本,在这种情况下,我必须导出每个 python 脚本的进程 ID。

我创建了一个示例来重现我遇到的问题。

基本上,我通常通过

source run2.sh
启动我的程序,首先判断当前是否正在运行同一个程序以避免重复运行,如果没有,则提交一个新作业并将
PID
更改为
~/.bashrc
中的新作业.

run2.sh

submit_a_job()
{
    nohup bash tmp.sh &
    export PID=$! # get the process ID of the above submitted job
    echo "job $PID submitted at $(date)"
    echo "job $PID submitted at $(date)" >> output.log
    echo "export PID=$!" >> ~/.bashrc
}

if [ -n "$PID" ]; then
# PID set, safe to run any job
    if ps -p $PID > /dev/null; then
    # the job is still running
        echo "$PID is running, new job not submitted"
    else
    # the job has finished, delete previous PID, and submit a new job
        echo "$PID is finished, new job submitted"
        sed -i '/PID/d' ~/.bashrc
        submit_a_job
    fi
else
# PID not set, the job might still be running or have finished
    echo "helloworld"
    submit_a_job
fi

如果您不想修改

~/.bashrc
,可以在
run2.sh
中注释掉以下行。并确保使用
run2.sh
运行
source
,否则环境变量不会导出到当前工作 shell。

echo "export PID=$!" >> ~/.bashrc
sed -i '/PID/d' ~/.bashrc

tmp.sh
是运行python作业的脚本

time python3 while.py

while.py
只是一个毫无意义的死循环

import time

counter = 0

while True:
    print(f"This is an infinite loop! Iteration: {counter}", flush=True)
    counter += 1
    time.sleep(1)  # Sleep for 1 second between iterations

由于我已将运行

bash tmp.sh
的进程 ID 导出为
PID
,因此我可以使用命令
tmp.sh
终止 bash 脚本
kill $PID
。问题是,即使
tmp.sh
不再运行,我杀死
tmp.sh
时运行的 python 脚本仍然在后台运行。我可以通过命令
ps aux | grep python3
确认这一点,它清楚地表明
while.py
正在运行。

我应该使用哪个命令来杀死bash脚本

tmp.sh
以及在我杀死
tmp.sh
的同时运行的python程序?

python bash kill-process
1个回答
0
投票

杀死整个进程组,而不仅仅是 shell 进程。

kill -INT -$PID

当您给

kill
提供负PID时,它会将其视为进程组ID。

© www.soinside.com 2019 - 2024. All rights reserved.