нет судьбы
С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204
|
Добавлено: 26/05/15 в 11:29 |
Насколько мне известно исполнение php в cli не имеет ограничения на время исполнения. Если это так, то как можно обезопасить себя в подобных запусках
Код: | exec("path/php -f script.php > /dev/null &"); |
от повисших скриптов?
использую данную конструкцию для асинхронного запуска скриптов с минутной задержкой, которая хоть и происходит редко, но не должна мешать выполнению скриптов, которые взаимодействуют с выводом на страницы.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 26/05/15 в 12:13 |
getmypid() - получаем свой пид, пишем в файл. По завершению работы, файлик убиваем.
Кроном прогоняем пид файлы, у кого время старее чем разрешено, достаем его пид и убиваем.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
9
|
|
|
С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032
|
Добавлено: 26/05/15 в 12:18 |
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 &
|
|
apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only
|
9
|
|
|
нет судьбы
С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204
|
Добавлено: 26/05/15 в 12:46 |
johndoe2: Ну это вобще красота!
Только во FeeBSD походу нет такой утилиты timeout.
|
|
|
|
нет судьбы
С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204
|
Добавлено: 26/05/15 в 13:16 |
timelimit во фрях решает ту же задачу? Параметры вроде похожи, но я далеко не админ могу что-то пропустить.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 26/05/15 в 15:49 |
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
нет судьбы
С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204
|
Добавлено: 26/05/15 в 18:52 |
Честно признаюсь, мне бы сейчас не помешало что-тор вроде совета в таком виде:
exec("blabalabal path/php -f script.php > /dev/null 2>&1 &");
только BSD варианте.
Если это проверено уже было на работоспособность. ХЗ, как такое тестировать, и с unix я далеко не на ты.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 26/05/15 в 20:16 |
Есть же sigalrm. Внутри запускаемого скрипта - ставим таймаут 100 сек и скрипт через 100 сек самовыпиливается даже на повисшем системколл.
Код: |
pcntl_signal(SIGALRM, "sig_alarm");
pcntl_alarm(100);
function sig_alarm($signal)
{
exit ();
}
Дальше сам скрипт
|
|
|
|
|
нет судьбы
С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204
|
Добавлено: 28/05/15 в 10:54 |
А откуда вобще пошла мода писать exec("path/php, а не просто exec("php ?
Вроде как полные пути только для крон заданий нужны, а cli php и так работает >php -f script.php . При этом это на один шаг увеличивает настройку конфигов, где нужно сначала узнать и вписать полный путь к php.
|
|
|
|
С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032
|
Добавлено: 28/05/15 в 11:17 |
Vyacheslav писал: |
А откуда вобще пошла мода писать exec("path/php, а не просто exec("php ?
Вроде как полные пути только для крон заданий нужны, а cli php и так работает >php -f script.php . При этом это на один шаг увеличивает настройку конфигов, где нужно сначала узнать и вписать полный путь к php. |
чтобы подстраховаться на случай, если в $PATH нет /usr/bin, в котором обычно бинарник php лежит
|
|
apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only
|
9
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 28/05/15 в 11:28 |
Vyacheslav писал: | А откуда вобще пошла мода писать exec("path/php, а не просто exec("php ?
Вроде как полные пути только для крон заданий нужны, а cli php и так работает >php -f script.php . При этом это на один шаг увеличивает настройку конфигов, где нужно сначала узнать и вписать полный путь к php. |
Потому что хрен знает какой там pwd и path. Из cli запустишь без путей - заработает, из крона хуй. Например. В общем лишний повод для багов.
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 28/05/15 в 14:15 |
вопрос в догонку по теме cli
В кроне запускаю какую-нить нарезку тумб, и он сохраняет картинки(и не только) с рутовскими правами (0, 0) а тотже скрипт но запущеный через браузер с правами юзера для сайта сохраняет файлы. Про wget в курсе, но как отучить пых от записи в режиме cli файлов с рутовыми правами.
|
|
|
|
С нами с 19.10.11
Сообщения: 87
Рейтинг: 135
|
Добавлено: 28/05/15 в 19:18 |
Ailk: Запускать от юзера?
|
|
|
|
💀💀💀
С нами с 31.05.10
Сообщения: 4689
Рейтинг: 728
|
Добавлено: 28/05/15 в 19:30 |
а если их несколько, по юзеру на каждый сайт. а кроны везде есть. от какого запускать? мож в команде крона от юзера запускать? Я ваще ни бум бум в этом
|
|
|
|
С нами с 19.10.11
Сообщения: 87
Рейтинг: 135
|
Добавлено: 28/05/15 в 19:42 |
Ailk:
В папке /etc/cron.d/ делаешь файл например usercron.
И туда такое:
* * * * * user1 /home/user1/path/to/run
* * * * * user2 /home/user2/path/to/run
* * * * * user3 /home/user3/path/to/run
|
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 31/05/15 в 10:09 |
Vyacheslav писал: | Насколько мне известно исполнение php в cli не имеет ограничения на время исполнения. |
что за ересь?
у меня скрипты по умолчанию отрубаются через минуту - настраивается в конфиге.
если нет то можно поставить таймаут явно.
set_time_limit(30);
|
|
|
|
С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032
|
Добавлено: 31/05/15 в 13:43 |
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.
|
|
apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only
|
8
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 02/06/15 в 09:22 |
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 раз
|
|
|
|
С нами с 09.08.12
Сообщения: 185
Рейтинг: 378
|
Добавлено: 02/06/15 в 09:24 |
...
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 02/06/15 в 09:45 |
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
|
|
|
|
|