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:
Ну это вобще красота!
Только во FeeBSD походу нет такой утилиты timeout.
цитата
26/05/15 в 13:16
Vyacheslav
timelimit
во фрях решает ту же задачу? Параметры вроде похожи, но я далеко не админ могу что-то пропустить.
цитата
26/05/15 в 15:49
Stek
По фре:
http://www.opennet.ru/openforum/vsluhforumID1/95188.html
цитата
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)
а тотже скрипт но запущеный через браузер с правами юзера для сайта сохраняет файлы. Про wget в курсе, но как отучить пых от записи в режиме cli файлов с рутовыми правами.
цитата
28/05/15 в 19:18
Salis
Ailk:
Запускать от юзера?
цитата
28/05/15 в 19:30
Ailk
а если их несколько, по юзеру на каждый сайт. а кроны везде есть. от какого запускать? мож в команде крона от юзера запускать? Я ваще ни бум бум в этом
цитата
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
Новая тема
Ответить
Эта страница в полной версии