Реклама на сайте Advertise with us

Exec("php -f script.php > /dev/null &"); время

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

нет судьбы

С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204


Передовик Master-X (16.07.2011) Передовик Master-X (16.10.2011) Передовик Master-X (01.11.2011) Передовик Master-X (16.11.2011) Передовик Master-X (01.01.2012) Ветеран трепа Master-X (16.02.2012)
Ссылка на сообщениеДобавлено: 26/05/15 в 11:29       Ответить с цитатойцитата 

Насколько мне известно исполнение php в cli не имеет ограничения на время исполнения. Если это так, то как можно обезопасить себя в подобных запусках
Код:
exec("path/php -f script.php > /dev/null &");

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

использую данную конструкцию для асинхронного запуска скриптов с минутной задержкой, которая хоть и происходит редко, но не должна мешать выполнению скриптов, которые взаимодействуют с выводом на страницы.

1
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 26/05/15 в 12:13       Ответить с цитатойцитата 

getmypid() - получаем свой пид, пишем в файл. По завершению работы, файлик убиваем.
Кроном прогоняем пид файлы, у кого время старее чем разрешено, достаем его пид и убиваем.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

9
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 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


Передовик Master-X (16.07.2011) Передовик Master-X (16.10.2011) Передовик Master-X (01.11.2011) Передовик Master-X (16.11.2011) Передовик Master-X (01.01.2012) Ветеран трепа Master-X (16.02.2012)
Ссылка на сообщениеДобавлено: 26/05/15 в 12:46       Ответить с цитатойцитата 

johndoe2: Ну это вобще красота! smail54.gif
Только во FeeBSD походу нет такой утилиты timeout. icon_neutral.gif

1
 

нет судьбы

С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204


Передовик Master-X (16.07.2011) Передовик Master-X (16.10.2011) Передовик Master-X (01.11.2011) Передовик Master-X (16.11.2011) Передовик Master-X (01.01.2012) Ветеран трепа Master-X (16.02.2012)
Ссылка на сообщениеДобавлено: 26/05/15 в 13:16       Ответить с цитатойцитата 

timelimit во фрях решает ту же задачу? Параметры вроде похожи, но я далеко не админ могу что-то пропустить.

1
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 26/05/15 в 15:49       Ответить с цитатойцитата 

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

8
 

нет судьбы

С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204


Передовик Master-X (16.07.2011) Передовик Master-X (16.10.2011) Передовик Master-X (01.11.2011) Передовик Master-X (16.11.2011) Передовик Master-X (01.01.2012) Ветеран трепа Master-X (16.02.2012)
Ссылка на сообщениеДобавлено: 26/05/15 в 18:52       Ответить с цитатойцитата 

Честно признаюсь, мне бы сейчас не помешало что-тор вроде совета в таком виде:
exec("blabalabal path/php -f script.php > /dev/null 2>&1 &");
только BSD варианте.
Если это проверено уже было на работоспособность. ХЗ, как такое тестировать, и с unix я далеко не на ты.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 26/05/15 в 20:16       Ответить с цитатойцитата 

Есть же sigalrm. Внутри запускаемого скрипта - ставим таймаут 100 сек и скрипт через 100 сек самовыпиливается даже на повисшем системколл.

Код:

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

Дальше сам скрипт

8
 

нет судьбы

С нами с 27.03.03
Сообщения: 4427
Рейтинг: 4204


Передовик Master-X (16.07.2011) Передовик Master-X (16.10.2011) Передовик Master-X (01.11.2011) Передовик Master-X (16.11.2011) Передовик Master-X (01.01.2012) Ветеран трепа Master-X (16.02.2012)
Ссылка на сообщениеДобавлено: 28/05/15 в 10:54       Ответить с цитатойцитата 

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

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 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
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 28/05/15 в 11:28       Ответить с цитатойцитата 

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


Потому что хрен знает какой там pwd и path. Из cli запустишь без путей - заработает, из крона хуй. Например. В общем лишний повод для багов.

9
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 28/05/15 в 14:15       Ответить с цитатойцитата 

вопрос в догонку по теме cli
В кроне запускаю какую-нить нарезку тумб, и он сохраняет картинки(и не только) с рутовскими правами (0, 0) icon_confused.gif icon_eek.gif а тотже скрипт но запущеный через браузер с правами юзера для сайта сохраняет файлы. Про wget в курсе, но как отучить пых от записи в режиме cli файлов с рутовыми правами.

0
 



С нами с 19.10.11
Сообщения: 87
Рейтинг: 135

Ссылка на сообщениеДобавлено: 28/05/15 в 19:18       Ответить с цитатойцитата 

Ailk: Запускать от юзера? trollface.png

1
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 28/05/15 в 19:30       Ответить с цитатойцитата 

а если их несколько, по юзеру на каждый сайт. а кроны везде есть. от какого запускать? мож в команде крона от юзера запускать? Я ваще ни бум бум в этом smail101.gif

0
 



С нами с 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

1
 



С нами с 09.08.12
Сообщения: 185
Рейтинг: 378

Ссылка на сообщениеДобавлено: 31/05/15 в 10:09       Ответить с цитатойцитата 

Vyacheslav писал:
Насколько мне известно исполнение php в cli не имеет ограничения на время исполнения.

что за ересь?

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

set_time_limit(30);

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 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?

Код: [развернуть]


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

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

Последний раз редактировалось: rickdeckard (02/06/15 в 09:25), всего редактировалось 1 раз

0
 



С нами с 09.08.12
Сообщения: 185
Рейтинг: 378

Ссылка на сообщениеДобавлено: 02/06/15 в 09:24       Ответить с цитатойцитата 

...

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 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

1
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »