Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: мониторинг процесса (запущен / не запущен / подвис)
 
 автор: naxa   (05.09.2009 в 19:23)   письмо автору
 
 

Здравствуйте!
есть скрипт, который нужно, чтобы работал постоянно, а когда завершит поставленную задачу - запускался снова.

допустим вешаем на крон - запускать каждую минуту
в самом скрипте вот такое:

<?php

set_time_limit
(0);
ignore_user_abort(1);

class 
Thread {  
  function 
RegisterPID($pidFile) {
    if (
$fp fopen($pidFile'w')) {
      
fwrite($fpgetmypid());
      
fclose($fp);
      @
chmod($pidFile0777);
      return 
true;
    }  
    return 
false;
  }
 
  function 
CheckPIDExistance($pidFile) {
    if (
$PID = @file_get_contents($pidFile)) {
      if (
posix_kill($PID0))
        return 
true;
    }
    return 
false;
  }
   
  function 
KillPid($pidFile) {
    if (
$PID = @file_get_contents($PIDFile))
      if (
posix_kill($PID0))
        
exec("kill -9 {$PID}");
  }  
}
?>

$thread = new Thread();
if ($thread->CheckPIDExistance($SCRIPT_PATH.'/'.PID_FILE))
  die("ERROR: Only one copy of the script could be executed at the same time\n");

if (!$thread->RegisterPID($SCRIPT_PATH.'/'.PID_FILE))
  die("ERROR: Cannot register script's PID\n"); 




{СКРИПТ}



$thread->KillPid($SCRIPT_PATH.'/'.PID_FILE);




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

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

в общем - как определить, что скрипт подвис?

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

есть ещё какие-нить более функциональные решения?

  Ответить  
 
 автор: Trianon   (05.09.2009 в 20:44)   письмо автору
 
   для: naxa   (05.09.2009 в 19:23)
 

может будет проще, если Вы всё то же самое без классов нарисуете?

  Ответить  
 
 автор: naxa   (05.09.2009 в 21:06)   письмо автору
 
   для: Trianon   (05.09.2009 в 20:44)
 

проще для кого? проще чтобы помочь?

не совсем понял о чём Вы и причём здесь классы ...

  Ответить  
 
 автор: Trianon   (05.09.2009 в 21:22)   письмо автору
 
   для: naxa   (05.09.2009 в 21:06)
 

для Вас. Проще, чтобы понять.

UPD. я-то продрался сквозь шелуху ОО-синтаксиса, и въехал в написанное.
Но вот совсем не убежден, что Вы понимаете, как оно на самом деле работает.
И шелуха этому пониманию изрядно мешает.

  Ответить  
 
 автор: naxa   (05.09.2009 в 21:30)   письмо автору
 
   для: Trianon   (05.09.2009 в 21:22)
 

вопрос заключается в этом:

как определить, что скрипт подвис?

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

есть ещё какие-нить более функциональные решения?


то что привёл выше ... ну не знаю - в порыве писанины написал :), но речь совсем не об этом ...

  Ответить  
 
 автор: Trianon   (05.09.2009 в 21:44)   письмо автору
 
   для: naxa   (05.09.2009 в 21:30)
 

>[b]как определить, что скрипт подвис?
Если в течение разумного времени (куда менее 30 секунд) скрипт успешно не завершил работу, значит он подвис.

Сервисы (демоны) на php не пишут.

  Ответить  
 
 автор: naxa   (05.09.2009 в 22:04)   письмо автору
 
   для: Trianon   (05.09.2009 в 21:44)
 

>>Если в течение разумного времени (куда менее 30 секунд) скрипт успешно не завершил работу, значит он подвис.

вы вообще читали, что я написал? :)

===================
1). есть скрипт, который нужно, чтобы работал постоянно, а когда завершит поставленную задачу - запускался снова.
2) привязывать скрипт ко времени и убивать его принудительно не желательно, т.к. не известно, сколько он будет выполняться ...
===================

set_time_limit(0); стоит там не случайно ... и ни о каких 30 сек не может быть и речи ...



>>Сервисы (демоны) на php не пишут.

а на чём пишутся? мне б что-нить простенькое ... может подскажите какие-нить готовые решения? т.к. я даже не знаю в какую сторону копать - и что искать ...

из того что искал - ничего не нашёл :(

  Ответить  
 
 автор: @ndry   (06.09.2009 в 11:00)   письмо автору
 
   для: naxa   (05.09.2009 в 22:04)
 

На С++ например... Зависит от задачи, всегда можно найти другой выход.

  Ответить  
 
 автор: @ndry   (06.09.2009 в 10:56)   письмо автору
 
   для: Trianon   (05.09.2009 в 21:44)
 

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

  Ответить  
 
 автор: Trianon   (06.09.2009 в 11:00)   письмо автору
 
   для: @ndry   (06.09.2009 в 10:56)
 

именно поэтому демоны на php не пишут. :)

  Ответить  
 
 автор: @ndry   (06.09.2009 в 10:58)   письмо автору
 
   для: naxa   (05.09.2009 в 19:23)
 

Советую вам почитать http://ru.php.net/manual/en/book.pcntl.php.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования