我启动一个python脚本,然后过一段时间我想杀死它。但是在终止该脚本之前,我想启动该脚本的另一副本,然后在启动新脚本之后终止先前的脚本。我想循环执行此操作。
这是我的代码,我只需要一种干净的方法来杀死脚本。我不想使用超时。
#!/bin/bash
while true
do
echo "starting FIRST Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
sleep 20
echo "starting SECOND Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
# Here I want to kill FIRST Consumer.py
sleep 20
# Here I want to kill SECOND Consumer.py
done
答案 0 :(得分:2)
每次启动后台进程时,bash
都会维护一个作业列表,其ID从1开始。
内置jobs
会列出后台作业。
在您遇到的情况下,您将添加kill %1
来杀死有史以来开始的第一个后台作业,然后添加kill %2
==编辑== 您的脚本变为:
#!/bin/bash
while : ; do
echo "starting FIRST Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
sleep 20
echo "starting SECOND Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
kill %1
sleep 20
kill %2
wait
done
答案 1 :(得分:2)
您可以获取第一个进程的PID来杀死它:
#!/bin/bash
while true
do
echo "starting FIRST Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
pid=$!
sleep 20
echo "starting SECOND Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
new_pid=$!
# Here I want to kill FIRST Consumer.py
kill "$pid"
sleep 20
# Here I want to kill SECOND Consumer.py
kill "$new_pid"
done
答案 2 :(得分:2)
在bash
中有两个特殊的后台作业:+
和-
。您可以在jobs
命令的输出中看到它们:
$ sleep 10 &
$ sleep 20 &
$ sleep 30 &
$ jobs
[1] Running sleep 10 &
[2]- Running sleep 20 &
[3]+ Running sleep 30 &
+
是最近运行的作业。 -
是+
之前的最新工作。如果您取消工作或开始新工作,两者都会更新。因此,您可以按照以下步骤完成脚本:
#!/bin/bash
while true; do
echo "starting FIRST Consumer.py : $(date +%T)"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
sleep 20
echo "starting SECOND Consumer.py : $(date +%T)"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
kill %- # kill FIRST Consumer.py
sleep 20
kill %+ # kill SECOND Consumer.py
done
仅当Consumer.py
的运行时间始终超过20秒时,此方法才能可靠地运行。如果Consumer.py
可以在20秒结束之前终止,那么我们可能会杀死错误的工作。要变通解决此问题,您可以使用(python3 .../Consumer.py; sleep inf) &
而不是python3 .../Consumer.py &
。 sleep inf
将阻止作业自行终止。
答案 3 :(得分:0)
我会这样做
#!/bin/bash
function check_pid() {
if /bin/ps -p $1 > /dev/null
then
kill $1
else
echo "not running"
fi
}
while true
do
echo "starting FIRST Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
pid1=$!
sleep 20
echo "starting SECOND Consumer.py : $(date +"%T")"
python3 /home/irum/Desktop/Marketsyc/Consumer.py &
pid2=$!
# Here I want to kill FIRST Consumer.py
check_pid $pid1
sleep 20
# Here I want to kill SECOND Consumer.py
check_pid $pid2
done
通过这种方式,仅当该进程仍在运行时,该进程才会被终止。