我使用
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程序?
杀死整个进程组,而不仅仅是 shell 进程。
kill -INT -$PID
当您给
kill
提供负PID时,它会将其视为进程组ID。