Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Exec("php -f script.php > /dev/null &"); время
цитата
26/05/15 в 11:29
 Vyacheslav
Насколько мне известно исполнение php в cli не имеет ограничения на время исполнения. Если это так, то как можно обезопасить себя в подобных запусках
Код:
exec("path/php -f script.php > /dev/null &");

от повисших скриптов?

использую данную конструкцию для асинхронного запуска скриптов с минутной задержкой, которая хоть и происходит редко, но не должна мешать выполнению скриптов, которые взаимодействуют с выводом на страницы.
цитата
26/05/15 в 12:13
 Stek
getmypid() - получаем свой пид, пишем в файл. По завершению работы, файлик убиваем.
Кроном прогоняем пид файлы, у кого время старее чем разрешено, достаем его пид и убиваем.
цитата
26/05/15 в 12:18
 johndoe2
http://linux.die.net/man/1/timeout

ограничение времени работы в 100 сек например
exec("timeout -s9 100 path/php -f script.php > /dev/null &");

и когда задачи в фон пускаешь, откреплять нужно не только stdout, но и stderr. так что не >/dev/null & а >/dev/null 2>&1 &
цитата
26/05/15 в 12:46
 Vyacheslav
johndoe2: Ну это вобще красота! smail54.gif
Только во FeeBSD походу нет такой утилиты timeout. icon_neutral.gif
цитата
26/05/15 в 13:16
 Vyacheslav
timelimit во фрях решает ту же задачу? Параметры вроде похожи, но я далеко не админ могу что-то пропустить.
цитата
26/05/15 в 18:52
 Vyacheslav
Честно признаюсь, мне бы сейчас не помешало что-тор вроде совета в таком виде:
exec("blabalabal path/php -f script.php > /dev/null 2>&1 &");
только BSD варианте.
Если это проверено уже было на работоспособность. ХЗ, как такое тестировать, и с unix я далеко не на ты.
цитата
26/05/15 в 20:16
 Pentarh
Есть же sigalrm. Внутри запускаемого скрипта - ставим таймаут 100 сек и скрипт через 100 сек самовыпиливается даже на повисшем системколл.

Код:

pcntl_signal(SIGALRM, "sig_alarm");
pcntl_alarm(100);
function sig_alarm($signal)
{
exit ();
}

Дальше сам скрипт
цитата
28/05/15 в 10:54
 Vyacheslav
А откуда вобще пошла мода писать exec("path/php, а не просто exec("php ?
Вроде как полные пути только для крон заданий нужны, а cli php и так работает >php -f script.php . При этом это на один шаг увеличивает настройку конфигов, где нужно сначала узнать и вписать полный путь к php.
цитата
28/05/15 в 11:17
 johndoe2
Vyacheslav писал:

А откуда вобще пошла мода писать exec("path/php, а не просто exec("php ?
Вроде как полные пути только для крон заданий нужны, а cli php и так работает >php -f script.php . При этом это на один шаг увеличивает настройку конфигов, где нужно сначала узнать и вписать полный путь к php.


чтобы подстраховаться на случай, если в $PATH нет /usr/bin, в котором обычно бинарник php лежит
цитата
28/05/15 в 11:28
 Pentarh
Vyacheslav писал:
А откуда вобще пошла мода писать exec("path/php, а не просто exec("php ?
Вроде как полные пути только для крон заданий нужны, а cli php и так работает >php -f script.php . При этом это на один шаг увеличивает настройку конфигов, где нужно сначала узнать и вписать полный путь к php.


Потому что хрен знает какой там pwd и path. Из cli запустишь без путей - заработает, из крона хуй. Например. В общем лишний повод для багов.
цитата
28/05/15 в 14:15
 Ailk
вопрос в догонку по теме cli
В кроне запускаю какую-нить нарезку тумб, и он сохраняет картинки(и не только) с рутовскими правами (0, 0) icon_confused.gif icon_eek.gif а тотже скрипт но запущеный через браузер с правами юзера для сайта сохраняет файлы. Про wget в курсе, но как отучить пых от записи в режиме cli файлов с рутовыми правами.
цитата
28/05/15 в 19:18
 Salis
Ailk: Запускать от юзера? trollface.png
цитата
28/05/15 в 19:30
 Ailk
а если их несколько, по юзеру на каждый сайт. а кроны везде есть. от какого запускать? мож в команде крона от юзера запускать? Я ваще ни бум бум в этом smail101.gif
цитата
28/05/15 в 19:42
 Salis
Ailk:

В папке /etc/cron.d/ делаешь файл например usercron.
И туда такое:
* * * * * user1 /home/user1/path/to/run
* * * * * user2 /home/user2/path/to/run
* * * * * user3 /home/user3/path/to/run
цитата
31/05/15 в 10:09
 rickdeckard
Vyacheslav писал:
Насколько мне известно исполнение php в cli не имеет ограничения на время исполнения.

что за ересь?

у меня скрипты по умолчанию отрубаются через минуту - настраивается в конфиге.
если нет то можно поставить таймаут явно.

set_time_limit(30);
цитата
31/05/15 в 13:43
 johndoe2
rickdeckard писал:

что за ересь?

у меня скрипты по умолчанию отрубаются через минуту - настраивается в конфиге.
если нет то можно поставить таймаут явно.

set_time_limit(30);


max_execution_time integer

This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30. When running PHP from the command line the default setting is 0.
цитата
02/06/15 в 09:22
 rickdeckard
johndoe2 писал:
max_execution_time integer

This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30. When running PHP from the command line the default setting is 0.


окей и че? строку видели set_time_limit?

<?php

set_time_limit(10);

foreach (range(1, 15) as $i) {
   echo $i . PHP_EOL;
   sleep(1);
}


запустите с консоли.
если тестовый скрипт не вырубится через 10 сек. - увольняйте админа или меняйте хостинг.

я конечно понимаю можно и костыли налепить - там демон отдельный поднять чтобы следил за процессами и убивал, использовать всякие посылы сигналов ОС.
но помоему вещь элементарно делается на уровне установки настройки в конфиге или из скрипта.

Последний раз редактировалось: rickdeckard (02/06/15 в 09:25), всего редактировалось 1 раз
цитата
02/06/15 в 09:24
 rickdeckard
...
цитата
02/06/15 в 09:45
 Pentarh
rickdeckard писал:
окей и че? строку видели set_time_limit?

Код:
pentarh@pentbook:~$ php
<?php

set_time_limit(10);

foreach (range(1, 15) as $i) {
   echo $i . PHP_EOL;
   sleep(1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15



Код:
pentarh@pentbook:~$ php
<?php
    declare(ticks = 1);

    function signal_handler($signal) {
        print "Caught SIGALRM\n";
   exit();
   }
    pcntl_signal(SIGALRM, "signal_handler", true);
    pcntl_alarm(3);
foreach (range(1, 15) as $i) {
   echo $i . PHP_EOL;
   sleep(1);
}
1
2
3
Caught SIGALRM


Эта страница в полной версии