代码之家  ›  专栏  ›  技术社区  ›  irum zahra

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

  •  0
  • irum zahra  · 技术社区  · 6 年前

    我启动了一个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 回复  |  直到 6 年前
        1
  •  2
  •   Poshi    6 年前

    您可以获取第一个进程的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
  •   Socowi    6 年前

    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秒。如果 消费品 可能在20秒结束之前终止,然后我们可能会杀死错误的作业。要解决此问题,可以使用 (python3 .../Consumer.py; sleep inf) & 而不是 python3 .../Consumer.py & . 这个 sleep inf 将阻止作业自行终止。

        3
  •  2
  •   Jay jargot    6 年前

    每次启动后台进程时, bash 维护作业列表,ID从1开始。

    这个 jobs builtin列出后台作业。

    在您的情况下,您可以添加 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
    
        4
  •  0
  •   Gioachino Bartolotta    6 年前

    我会这样做

        #!/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
    

    这样,只有当进程仍在运行时,它才会被终止。