Ограничить время выполнения скрипта

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
gilas
мл. сержант
Сообщения: 85
Зарегистрирован: 2009-02-16 18:48:58

Ограничить время выполнения скрипта

Непрочитанное сообщение gilas » 2010-09-10 10:28:17

Приветствую! Обращаюсь за помощью к знающим. Есть php-скрипт, который вызывается из консоли, который возвращает опред. результат. Пример:

$ ./script.php
$ status OK

Суть в том, что данный скрипт не идеален, но изменить его структуру по некоторым причинам сложно. Проблема в том, что данный скрипт периодически зависает и ничего не возвращает. Пример:

$ ./script.php
*думает около 20 сек*
$

Вопрос - каким образом, при помоши bash ограничить время работы данного скрипта + присвоить простую проверку на предмет возврата. Например если скрипт ничего не вернул, повторить запуск. Благодарен за ответы.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Tuchka
рядовой
Сообщения: 23
Зарегистрирован: 2008-09-19 7:54:52
Контактная информация:

Re: Ограничить время выполнения скрипта

Непрочитанное сообщение Tuchka » 2010-09-10 10:39:10

Вам только bash подходит ?
Например можно ведь сделать запуск тестового скрипта из другого (проверяющего )скрипта. На перловке я бы сделала запуск скрипта , затем паузу на 20 секунд

Код: Выделить всё

select(undef, undef, undef, 20);
Потом проверка (можно сделать kill если надо убить не завершенный процесс) и запуск снова ( в цикле).

gilas
мл. сержант
Сообщения: 85
Зарегистрирован: 2009-02-16 18:48:58

Re: Ограничить время выполнения скрипта

Непрочитанное сообщение gilas » 2010-09-10 10:55:23

Спасибо за ответ. К сожалению на машине, где происходит вызов скрипта отсутствует perl и поставить его нет возможности. Посему, моя задача просит решения с помощью bash.

gilas
мл. сержант
Сообщения: 85
Зарегистрирован: 2009-02-16 18:48:58

Re: Ограничить время выполнения скрипта

Непрочитанное сообщение gilas » 2010-09-10 17:37:21

Неужели bash-знатоки перевелись с данного ресурса ? ;-)

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: Ограничить время выполнения скрипта

Непрочитанное сообщение terminus » 2010-09-10 17:41:25

Там вроде можно было запускть что-либо в субшелле и потом продолжать выполнение родительского скрипта. Надо будет только узнать pid прошесса в субшелле...

Вот так вроде субшел вызывается - выполняем команду true в нем: Ну а дальше мониторить по пиду...
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

Нефиг_чем_заняться
проходил мимо

Re: Ограничить время выполнения скрипта

Непрочитанное сообщение Нефиг_чем_заняться » 2010-09-25 21:15:48

gilas писал(а):Неужели bash-знатоки перевелись с данного ресурса ? ;-)
Вот тоько не надо на "слабо" брать :), лучше пивом стимулировать, - ПИВОМ !

Код: Выделить всё

#! /usr/local/bin/bash
###########################################
# Default values
#------------------------------------------

declare -i timeout=20    # default timeout in seconds.

Kill='/bin/kill'
split_line='-------------------------------------------------------------------------------'

success_msg='status OK'  # that what external program should return on success
#
###########################################
ftmp="$(mktemp /tmp/$(basename $0).XXXXXXXX)"
trap "rm -f ${ftmp}" 0 1 2 5 15

ext_prg=$1

( ${ext_prg} )>${ftmp} 2>&1 &   # run some program in subshell
cPID=$!                         # get PID of subshell
sleep 5                         # wait at least 5 seconds to get time for process to start
((timeout-=5))

status=0
if [[ ${timeout} -gt 0 ]]; then
    while [[ $( ps | grep -o -G "^${cPID}"; ) -eq ${cPID} && ${status} -eq 0 ]]; do
        status=$((timeout-- ? 0 : 1)); sleep 1
    done
fi

if [[ ${status} -eq 1 ]]; then
    eval '${Kill} -9 ${cPID}' &>/dev/null;  # If timeout occured - kill child process
    echo "${split_line}"
    echo `basename $0`": Err: Timeout occured."
    echo "Process(${cPID}): ${ext_prg}"
    echo "was killed because of timeout."
    echo "${split_line}"
    exit 1
else
    echo "${split_line}"
    echo -en "Process(${cPID}): ${ext_prg}\nterminate by itself successfully.\n"
    rc=$(cat ${ftmp} | awk "/${success_msg}/"'{print $2}')
    if [[ -z "${rc}" ]]; then
        echo "${ext_prg}: ERR: no success code returned!!!"
        exit 1
    else
        echo "${ext_prg}: return success code!!!"
    fi
    echo "${split_line}"
fi

exit 0
Отрихтуйте под ваши нужды timeout(сколько ждать перед тем как похерить) и success_msg(сообщения пыха об успехе) и подсовывайте в скрипт выше в командной строке внешнюю программу(я так понял что это CLI-php)