как запускать новый процесс без размножения?

12
seosniks
На сайте с 13.08.2007
Offline
389
1434

Есть задача.

скрипт запускается по крону, как отследить выполнился ли скрипт или нет, если выполнился то крон не запускает новый процесс, если скрипт отработал то запускаем новый процесс.

Обработку процесса ограничить на 10 минут к примеру, затем убиваем и запускаем новый процесс.

пример

   //	обход повторного запуска

$filename = 'test.php';
exec("ps -auxww | grep $filename | grep -v grep",$output,$code);
if($code!=0 && $code!=1)
{
trigger_error("Unable to 'ps -auxww | grep $filename | grep -v grep'. Error code: $code<br>",E_USER_ERROR);
exit;
}
if(count($output)>1) {
echo 'Скрипт все еще работает - ';
echo date('h:i:s') . "\n";
print_r($output);
exit;
}

}
$time = date("Y-m-d H:i:s ", time()-$GlobalTime);
echo "Время обработки составило $time";

Еще можно в базе иметь поле например in и out

если in стало меньше out на указаноое время то выполняем новый процесс убив старый.

  $sql = mysql_query("SELECT *  FROM time");


if(mysql_num_rows($sql) >0) {
while($r = mysql_fetch_array($sql)) {
$end =$r["in"];
}}


$start=date("i");//Дата поста
$min= 2;//Количество минут через которые срабатывает скрипт
$start3=$start+$min;

echo "$start > $end";
if($start > $end)
{



echo "start ";
$sql4 = "UPDATE `time` SET `in` =$start3;";
mysql_query($sql4) or die(mysql_error());
}

else {

echo "end ";
$sql4 = "UPDATE `time` SET `in` =$end;";
mysql_query($sql4) or die(mysql_error());
}
N
На сайте с 06.05.2007
Offline
419
#1

так у вас же свой собственный скрипт? нужно изучить блокировки на файлах и в своем скрипте их реализовать.

блокировки выгоднее прочих педальных методов тем, что при внезапном ошибочном завершении скрипта блокировка снимается автоматически.

Кнопка вызова админа ()
seosniks
На сайте с 13.08.2007
Offline
389
#2
netwind:
так у вас же свой собственный скрипт? нужно изучить блокировки на файлах и в своем скрипте их реализовать.
блокировки выгоднее прочих педальных методов тем, что при внезапном ошибочном завершении скрипта блокировка снимается автоматически.

Первый скрипт собственный писался мне прогером, но с ним надо разбираться.

Второй мой, блокировка работает по времени но мне кажется что это много лишнего там.

самое простое как мне кажется это установить принудительно лимит

error_reporting(0);

set_time_limit(600); вырубаем скрипт через 600 сек.

далее нужно запускать крон и проверять процесс файла или дескриптор, как правильнее будет.

и если файл еще выполняется то крон выполняет то что попадает в if если процесс умер то else или true false.

Попробую поизвращатся позднее, щас жариже ужас. :D

N
На сайте с 06.05.2007
Offline
419
#3

чего проверять? вы бредите

http://en.wikipedia.org/wiki/Lock_%28computer_science%29

http://www.kurepin.ru/php/zametki/flock/

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

dkameleon
На сайте с 09.12.2005
Offline
386
#4
netwind:
создание файла-индикатора запуска.

+ его надо держать локнутым

и при старте проверять лок, тем самым узнавая, работает ли предыдущая копия :)

Дизайн интерьера (http://balabukha.com/)
N
На сайте с 06.05.2007
Offline
419
#5

dkameleon, можно, но нам такие опытные разработчики не по карману.

P
На сайте с 08.03.2007
Offline
250
#6

наверно надо гугль посмотреть, второй же ресурс по запросу "php lockfile" выдал http://www.ajohnstone.com/archives/lock-files-in-php-bash/ , да и остальные перспективные.

FFFFx029A
На сайте с 01.09.2007
Offline
142
#7

Можно создавать к примеру start.txt файл, если он присутствует то завершать работу скрипта, а проверку вначале где то поставить...

ЗЫ: если вообще его нельзя запускать, то сделать 2й скрипт который будет делать проверку и потом уже запускать основной скрипт...

http://www.youtube.com/watch?v=Gyl4E4EcPdc (http://www.youtube.com/watch?v=Gyl4E4EcPdc) - партнёрка от Мавроди и МММ))) http://miniwm.ru/soft.php?read=917 (http://miniwm.ru/soft.php?read=917) CMS MiniWM v2.8 - 49.99$
[Удален]
#8

мемкеш или файл. файл удобней тем, что вы можете отслеживать время работы скрипта при помощи функции filemtime()

Создаем файл task_lock при инициализации скрипта, далее в скрипте вы сможете проверить его рантайм (в цикле, например) time() - filemtime('task_lock') + ini_set('max_execution_time', ваше значение) (об этом уже говорилось).

Также, вам необходимо сделать функцию удаления вашего lock файла и вызывать ее на shutdown вот так: register_shutdown_function('my_shutdown')

функция my_shutdown будет выглядеть как то так:

function my_shutdown() { unlink('task_lock'); }

если файл существует, мы просто падаем die('locker is enabled');

Можно через мемкеш. Принцип такой же.

можно, но нам такие опытные разработчики не по карману.

какое по карману - не по карману? У вас задача на 10 минут - не надо никтому платить за подобные задачи.

rtyug
На сайте с 13.05.2009
Offline
263
#9

ну в принципе решается все элементарным pid на сколько я понял...

или чем он не подходит?

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
N
На сайте с 06.05.2007
Offline
419
#10
какое по карману - не по карману? У вас задача на 10 минут - не надо никтому платить за подобные задачи.

So1, а вот как раз такую наивность я и имел ввиду.

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

Блокировка эту проблему исключает. Хотя, применительно к cron, запускаемому каждую минуту такое почти невозможно.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий