bash-скрипт для уничтожения Python-скрипта после запуска другого такого же Python-скрипта - PullRequest
0 голосов
/ 29 января 2019

Я запускаю скрипт на 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 голосов
/ 30 января 2019

Я бы сделал это

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

Таким образом, процесс будет остановлен, только если он все еще выполняется.

0 голосов
/ 29 января 2019

Вы можете получить 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
0 голосов
/ 29 января 2019

В 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 остановит выполнение задания самостоятельно.

0 голосов
/ 29 января 2019

Каждый раз, когда запускается фоновый процесс, bash поддерживает список заданий с идентификаторами, начинающимися с 1.

Встроенная функция jobs перечисляет фоновые задания.

в вашей ситуации, вы бы добавили kill %1, чтобы убить первое в истории фоновое задание, а затем kill %2

== EDITED == Ваш сценарий станет:

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...