cronjob php time limit

Есть и такой ОС.

Модератор: weec

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

cronjob php time limit

Непрочитанное сообщение ExH » 2009-05-23 3:27:49

Возникла необходимость лимитировать для юзеров время выполнения скриптов на 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) не растёт.
Может оно как-то хитро считается?

Что можно сделать?

Хостинговая компания 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/

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-05-23 21:30:27

Разобрался, это происходит из-за операций ввода/вывода в скрипте, они не учитываются во времени исполнения.

Сделал так:

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

#!/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 перед добавлением.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение Alex Keda » 2009-05-24 1:50:34

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

/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 - при запуске его процессов они не берут ограничений оттуда =(
Убей их всех! Бог потом рассортирует...

rainy
мл. сержант
Сообщения: 76
Зарегистрирован: 2008-02-01 23:26:45

Re: cronjob php time limit

Непрочитанное сообщение rainy » 2009-05-29 14:26:28

а вообще - в фре это можно сделать через login.conf
в линуксе через limits.conf

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-05-29 14:30:10

Насколько я понимаю не login.conf на limits.conf не работают если скрипт не занимает процессорное время, а открыл сокет и ждёт данные.
Что именно надо прописать в limits.conf?

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-05-30 2:07:53

И ещё раз переписанный код.
Главное отличие -- не спим 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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение Alex Keda » 2009-06-01 9:31:05

ужас какой-то...
пачка форков чтобы присматривать за одним процессом...
=======
делайте глобально тогда уж.
пишите на перле, провреяйте всех сразу и храните между запусками где-то статистику.
сейчас у вас накладных расходов немеряно.
решение не для нагруженного сервера
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-06-01 10:53:33

А почему пачка форков?
я так понимаю что на один процесс -- один форк, нет?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение Alex Keda » 2009-06-01 11:45:56

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

while [ $counter -lt 30 ]
1

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

if [ 0 == $? ]
2

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

sleep 1s
3
==========
три в секунду.
чуть не сотня на всё время жизни процесса - с учётом тех что не считал.
очень дорогое решение - особенно с учётом что у вас не фря - в ней форк быстрей выполняется.
Убей их всех! Бог потом рассортирует...

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-06-01 11:59:50

Т.е. дешевле повесить на крон скрипт который раз в секунду будет парсить вывод ps?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение Alex Keda » 2009-06-01 16:10:30

да. причём скрип на чём-то более быстром чем sh
perl, например.
=======
и не раз в секунду. раз в 5 или 10. не надо стремитсья прям точно 30 секунд. не умрёт ваш сервер от лишних 5-10 секунд.
скорей вы его положите таким подходом.
Убей их всех! Бог потом рассортирует...

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение paix » 2009-06-02 11:35:58

как то сложно все у вас.

в общий php.ini прописать нужный time_limit, пхп при запуске эти настройки должен поумолчанию подхватывать, если иные не указаны.
А вообще всякие кронджобы - дыра.
With best wishes, Sergej Kandyla

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-06-02 14:43:55

Вот нравятся мне такие ответы, видно что человек уже сталкивался с проблемой и её решил.
Смешно даже.

Идём на 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 и про то какие параметры и как передаются.

А затем медитируем над собственным ответом и ищем что в нём вообще никак не вяжется с топиком.

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение paix » 2009-06-02 15:22:58

ну если смешно - смейтесь ;)
У меня вообще такой проблемы не стоит. Ибо самый толковый совет - это запретить кронджобы для юзеров.

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

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

Все эти тайм лимиты приводят к одному итогу - вы тратите время на недовольных юзеров.
With best wishes, Sergej Kandyla

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение paix » 2009-06-02 15:31:14

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), а вы, вероятно, считаете физическое время, прошедшее с начала запуска скрипта.
В данном случае поведение системы правильное.
With best wishes, Sergej Kandyla

ExH
рядовой
Сообщения: 45
Зарегистрирован: 2007-02-20 12:06:41

Re: cronjob php time limit

Непрочитанное сообщение ExH » 2009-06-02 15:35:17

То что система "правильная" сомнений нет, вопрос был именно в том как отсекать физическое время.
И он оказался решён выше.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: cronjob php time limit

Непрочитанное сообщение Alex Keda » 2009-06-02 23:59:09

lissyara писал(а):три в секунду.
чуть не сотня на всё время жизни процесса - с учётом тех что не считал.
очень дорогое решение - особенно с учётом что у вас не фря - в ней форк быстрей выполняется.
Убей их всех! Бог потом рассортирует...