Страница 1 из 1
cronjob php time limit
Добавлено: 2009-05-23 3:27:49
ExH
Возникла необходимость лимитировать для юзеров время выполнения скриптов на php запущенных через cronjob.
Для этого написал вместо /usr/local/bin/php:
Код: Выделить всё
#!/bin/bash
ulimit -t 10
/usr/local/php5/bin/php -d max_execution_time=10 -d max_input_time=10 "$@"
Не срабатывает. Скрипт спокойно может выполняться больше минуты.
При этом в выводе команды:
Код: Выделить всё
ps afxu
root 29744 0.0 0.0 1440 600 ? S 03:40 0:00 crond
root 2194 0.0 0.0 1448 628 ? S 04:17 0:00 \_ [crond]
user 2195 0.0 0.0 2040 904 ? S 04:17 0:00 \_ /bin/bash /usr/local/bin/php /home/user/domains/xxx/public_html/cron/cron.php
user 2196 0.8 0.3 18616 7296 ? S 04:17 0:01 | \_ /usr/local/php5/bin/php -d max_execution_time=10 -d max_input_time=10 /home/user/domains/xxx/public_html/cron/cron.php
Мне кажется что проблема в том, что время выполнения (0:01) не растёт.
Может оно как-то хитро считается?
Что можно сделать?
Re: cronjob php time limit
Добавлено: 2009-05-23 21:30:27
ExH
Разобрался, это происходит из-за операций ввода/вывода в скрипте, они не учитываются во времени исполнения.
Сделал так:
Код: Выделить всё
#!/bin/bash
ulimit -t 30
/usr/local/php5/bin/php -d max_execution_time=30 -d max_input_time=30 "$@" &
phppid=$!
sleep 30s
kill -s SIGTERM $phppid > /dev/null 2>&1
Осталась проблема, как скрыть от пользователя запуск скрипта из другого места или как запретить ему вызывать скрипт в обход моего врапера.
Пока единственное что приходит в голову, проверять crontab jobs перед добавлением.
Re: cronjob php time limit
Добавлено: 2009-05-24 1:50:34
Alex Keda
Код: Выделить всё
/usr/bin/top -b | /usr/bin/grep php-cgi |
{
while read stroka
do
# разбирем строку
pid=`/bin/echo $stroka | /usr/bin/awk '{print $1}'`
# время
work_time=`/bin/echo $stroka | /usr/bin/awk '{print $10}' | /usr/bin/tr -d ":"` # SMP
#work_time=`/bin/echo $stroka | /usr/bin/awk '{print $9}' | /usr/bin/tr -d ":"` # 1CPU
user_name="`/bin/echo $stroka | /usr/bin/awk '{print $2}'`"
# оцениваем время. если больше 040 - убиваем
if [ $work_time -ge 030 ] >/dev/null 2>&1
then
/bin/kill $pid >/dev/null 2>&1 &
fi
# добиваем
if [ $work_time -ge 040 ] >/dev/null 2>&1
then
/bin/kill -9 $pid >/dev/null 2>&1 &
fi
done
}
это кусок одной из моих подпорок.
=======
а вообще - в фре это можно сделать через login.conf
подпорка для fastcgi - при запуске его процессов они не берут ограничений оттуда =(
Re: cronjob php time limit
Добавлено: 2009-05-29 14:26:28
rainy
а вообще - в фре это можно сделать через login.conf
в линуксе через limits.conf
Re: cronjob php time limit
Добавлено: 2009-05-29 14:30:10
ExH
Насколько я понимаю не login.conf на limits.conf не работают если скрипт не занимает процессорное время, а открыл сокет и ждёт данные.
Что именно надо прописать в limits.conf?
Re: cronjob php time limit
Добавлено: 2009-05-30 2:07:53
ExH
И ещё раз переписанный код.
Главное отличие -- не спим 30 секунд, а спим по 1 секунде и каждый раз проверяем, жив ли процесс.
Если доживаем до 30 секунд прибиваем его сами.
Код: Выделить всё
ulimit -t 30
/usr/local/php5/bin/php -d max_execution_time=30 -d max_input_time=30 "$@" &
phppid=$!
counter=0
while [ $counter -lt 30 ]; do
kill -0 $phppid > /dev/null 2>&1
if [ 0 == $? ]
then
sleep 1s
else
break;
fi
let counter=counter+1
done
kill -s SIGTERM $phppid > /dev/null 2>&1
Re: cronjob php time limit
Добавлено: 2009-06-01 9:31:05
Alex Keda
ужас какой-то...
пачка форков чтобы присматривать за одним процессом...
=======
делайте глобально тогда уж.
пишите на перле, провреяйте всех сразу и храните между запусками где-то статистику.
сейчас у вас накладных расходов немеряно.
решение не для нагруженного сервера
Re: cronjob php time limit
Добавлено: 2009-06-01 10:53:33
ExH
А почему пачка форков?
я так понимаю что на один процесс -- один форк, нет?
Re: cronjob php time limit
Добавлено: 2009-06-01 11:45:56
Alex Keda
1
2
3
==========
три в секунду.
чуть не сотня на всё время жизни процесса - с учётом тех что не считал.
очень дорогое решение - особенно с учётом что у вас не фря - в ней форк быстрей выполняется.
Re: cronjob php time limit
Добавлено: 2009-06-01 11:59:50
ExH
Т.е. дешевле повесить на крон скрипт который раз в секунду будет парсить вывод ps?
Re: cronjob php time limit
Добавлено: 2009-06-01 16:10:30
Alex Keda
да. причём скрип на чём-то более быстром чем sh
perl, например.
=======
и не раз в секунду. раз в 5 или 10. не надо стремитсья прям точно 30 секунд. не умрёт ваш сервер от лишних 5-10 секунд.
скорей вы его положите таким подходом.
Re: cronjob php time limit
Добавлено: 2009-06-02 11:35:58
paix
как то сложно все у вас.
в общий php.ini прописать нужный time_limit, пхп при запуске эти настройки должен поумолчанию подхватывать, если иные не указаны.
А вообще всякие кронджобы - дыра.
Re: cronjob php time limit
Добавлено: 2009-06-02 14:43:55
ExH
Вот нравятся мне такие ответы, видно что человек уже сталкивался с проблемой и её решил.
Смешно даже.
Идём на php.net и читаем документацию.
Код: Выделить всё
Замечание: The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.
Потом читаем про отличия между вызовами CLI/CGI и про то какие параметры и как передаются.
А затем медитируем над собственным ответом и ищем что в нём вообще никак не вяжется с топиком.
Re: cronjob php time limit
Добавлено: 2009-06-02 15:22:58
paix
ну если смешно - смейтесь

У меня вообще такой проблемы не стоит. Ибо самый толковый совет - это запретить кронджобы для юзеров.
Код: Выделить всё
# /usr/bin/php-cgi 123.php > test ; grep max_execution_time test
<tr><td class="e">max_execution_time</td><td class="v">29</td><td class="v">29</td></tr>
# grep max_e /etc/php.d/custom.ini
max_execution_time = 29
+
Код: Выделить всё
disable_functions = symlink, shell_exec, exec, proc_get_status, proc_nice, proc_terminate, define_syslog_variables, syslog, openlog, closelog, escapeshellcmd, passthru, ocinumcols, ini_alter, leak, listen, chgrp, apache_note, apache_setenv, debugger_on, debugger_off, ftp_exec, dl, dll, ftp
в таком духе
+
limits.conf
Все эти тайм лимиты приводят к одному итогу - вы тратите время на недовольных юзеров.
Re: cronjob php time limit
Добавлено: 2009-06-02 15:31:14
paix
ExH писал(а):Возникла необходимость лимитировать для юзеров время выполнения скриптов на php запущенных через cronjob.
Не срабатывает. Скрипт спокойно может выполняться больше минуты.
При этом в выводе команды:
Код: Выделить всё
ps afxu
root 29744 0.0 0.0 1440 600 ? S 03:40 0:00 crond
root 2194 0.0 0.0 1448 628 ? S 04:17 0:00 \_ [crond]
user 2195 0.0 0.0 2040 904 ? S 04:17 0:00 \_ /bin/bash /usr/local/bin/php /home/user/domains/xxx/public_html/cron/cron.php
user 2196 0.8 0.3 18616 7296 ? S 04:17 0:01 | \_ /usr/local/php5/bin/php -d max_execution_time=10 -d max_input_time=10 /home/user/domains/xxx/public_html/cron/cron.php
Мне кажется что проблема в том, что время выполнения (0:01) не растёт.
Может оно как-то хитро считается?
Что можно сделать?
планировщик считает процессорное время, затраченное на выполнение данной задачи (0:01) (cumulative time), а вы, вероятно, считаете физическое время, прошедшее с начала запуска скрипта.
В данном случае поведение системы правильное.
Re: cronjob php time limit
Добавлено: 2009-06-02 15:35:17
ExH
То что система "правильная" сомнений нет, вопрос был именно в том как отсекать физическое время.
И он оказался решён выше.
Re: cronjob php time limit
Добавлено: 2009-06-02 23:59:09
Alex Keda
lissyara писал(а):три в секунду.
чуть не сотня на всё время жизни процесса - с учётом тех что не считал.
очень дорогое решение - особенно с учётом что у вас не фря - в ней форк быстрей выполняется.