Страница 1 из 1
Ограничить время выполнения скрипта
Добавлено: 2010-09-10 10:28:17
gilas
Приветствую! Обращаюсь за помощью к знающим. Есть php-скрипт, который вызывается из консоли, который возвращает опред. результат. Пример:
$ ./script.php
$ status OK
Суть в том, что данный скрипт не идеален, но изменить его структуру по некоторым причинам сложно. Проблема в том, что данный скрипт периодически зависает и ничего не возвращает. Пример:
$ ./script.php
*думает около 20 сек*
$
Вопрос - каким образом, при помоши bash ограничить время работы данного скрипта + присвоить простую проверку на предмет возврата. Например если скрипт ничего не вернул, повторить запуск. Благодарен за ответы.
Re: Ограничить время выполнения скрипта
Добавлено: 2010-09-10 10:39:10
Tuchka
Вам только bash подходит ?
Например можно ведь сделать запуск тестового скрипта из другого (проверяющего )скрипта. На перловке я бы сделала запуск скрипта , затем паузу на 20 секунд
Потом проверка (можно сделать kill если надо убить не завершенный процесс) и запуск снова ( в цикле).
Re: Ограничить время выполнения скрипта
Добавлено: 2010-09-10 10:55:23
gilas
Спасибо за ответ. К сожалению на машине, где происходит вызов скрипта отсутствует perl и поставить его нет возможности. Посему, моя задача просит решения с помощью bash.
Re: Ограничить время выполнения скрипта
Добавлено: 2010-09-10 17:37:21
gilas
Неужели bash-знатоки перевелись с данного ресурса ?
Re: Ограничить время выполнения скрипта
Добавлено: 2010-09-10 17:41:25
terminus
Там вроде можно было запускть что-либо в субшелле и потом продолжать выполнение родительского скрипта. Надо будет только узнать pid прошесса в субшелле...
Вот так вроде субшел вызывается - выполняем команду true в нем:
Ну а дальше мониторить по пиду...
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)
Ограничить время выполнения скрипта
Добавлено: 2023-03-25 8:51:31
Гость
man timeout