2014-12-22 3 views
4

У меня есть сценарий, который будет отслеживать процесс, и если этот процесс умирает, он будет его обновлять. Я хочу, чтобы сценарий отслеживания также убил процесс, если ему сказали, что он дает скрипт отслеживания как сигмер (например). Другими словами, если я убью скрипт отслеживания, он также должен убить процесс, который он отслеживает, а не снова респавнет и выйти.Как перезапустить процесс в bash или убить его по команде?

брусчатки вместе несколько сообщений (которые я думаю, лучшие практики, например, не использовать ПИД-файл), я получаю следующее:

#!/bin/bash 

DESC="Foo Manager" 
EXEC="python /myPath/bin/FooManager.pyc" 

trap "BREAK=1;pkill -HUP -P $BASHPID;exit 0" SIGHUP SIGINT SIGTERM 

until $EXEC 
do 
    echo "Server $DESC crashed with exit code $?. Restarting..." >&2 
    ((BREAK!=0)) && echo "Breaking" && exit 1 
    sleep 1 
done 

Итак, теперь, если я запускаю этот скрипт в одном Xterm. И затем в другой xterm отправлю сценарий примерно так:

kill -HUP <tracking_script_pid> # Doesn't work. 
kill -TERM <tracking_script_pid> #Doesn't work. 

Сценарий отслеживания не заканчивается или что-то еще. Если я запустил FooManager.pyc из командной строки, он умрет в SIGHUP и SIGTERM. В любом случае, что я могу делать неправильно здесь, и, возможно, есть совсем другой способ сделать это?

спасибо.

+0

Я полагаю, это интересно как упражнение с использованием bash, но если вы пытаетесь сделать это для чего-то реального, просто получите мастер: http: //ddollar.github.io/foreman/ –

ответ

3

Из инструкции:

Если Bash ждет команд для завершения и принимает сигнал, для которого была установлена ​​ловушка, ловушки не не будет выполняться до завершения команды. Когда Bash ожидает асинхронную команду через встроенный wait, прием сигнала, для которого установлен ловушка, приведет к тому, что встроенный wait будет возвращен сразу же с статусом выхода более 128, сразу после которого будет запущена ловушка.

Подчеркните мой.

Итак, в вашем случае, когда ваша команда выполняется, Bash будет ждать, пока она не закончится, прежде чем она запустит ловушку.

Чтобы исправить это, вам нужно запустить свою программу в качестве задания и дождаться ее. Если ваша программа никогда не завершается с кодом возврата больше, чем 128, вы можете упростить следующий код, но я не делаю это предположение:

#!/bin/bash 

desc="Foo Manager" 
to_exec=(python "/myPath/bin/FooManager.pyc") 

trap 'trap_triggered=true' SIGHUP SIGINT SIGTERM 

trap_triggered=false 
while ! $trap_triggered; do 
    "${to_exec[@]}" & 
    job_pid=$! 
    wait $job_pid 
    job_ret=$? 
    if [[ $job_ret = 0 ]]; then 
     echo >&2 "Job ended gracefully with no errors... quitting..." 
     break 
    elif ! $trap_triggered; then 
     echo >&2 "Server $desc crashed with exit code $job_ret. Restarting..." 
    else 
     printf >&2 "Received fatal signal... " 
     if kill -0 $job_pid >&/dev/null; then 
      printf >&2 "killing job $job_pid... " 
      kill $job_pid 
      wait $job_pid 
     fi 
     printf >&2 "quitting...\n" 
    fi 
done 

Notes.

  1. Я использовал строчную имя переменной, так как в верхнем регистре считаются плохой практикой: они могут конфликтовать с зарезервированными именами в Bash или переменные окружения.
  2. Я не использовал строку , чтобы сохранить команду, но массив. С помощью строки у вас будет много проблем, если вы хотите, чтобы смешные символы, такие как пробелы, передавались как аргументы. При правильно подобранном массиве у вас не будет никаких проблем. (Некоторые утверждают, что было бы еще лучше использовать функцию.)
+0

Спасибо за это. По большей части он работает, мне пришлось внести некоторые изменения в него, чтобы он фактически убил FooManager.pyc, как только скрипт отслеживания получит захваченный вызов. в любом случае, спасибо! – Bitdiot

+0

Несколько других вопросов, есть ли способ отличить плохой выход FooManager, который * не * запускает ловушку?FooManager имеет потенциал для сбоя, и было бы неплохо узнать, когда это произойдет, а не получить сигнал, чтобы убить скрипт отслеживания. – Bitdiot

+1

@Bitdiot в предыдущей версии Я забыл убить работу. Просмотрите мое редактирование: вы увидите, где и как это сделать. –

 Смежные вопросы

  • Нет связанных вопросов^_^