bash脚本在启动另一个相同的python脚本后杀死python脚本

时间:2019-01-29 13:14:33

标签: python linux bash

我启动一个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

4 个答案:

答案 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

通过这种方式,仅当该进程仍在运行时,该进程才会被终止。