отработка завершения консольного скрипта

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
отработка завершения консольного скрипта

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

Теперь проблема: уже пару раз была ситуация, когда машину, где работает скрипт, перегружали (не reset'ом, нормально). При этом остаётся .lock файл, и после перезагрузки скрипт работать отказывается.

Соответственно возникла задача, чтобы при принудительном завершении скрипта стирался .lock-файл. Но: register_shutdown_function() в консоли работает только если скрипт доработал до конца, при прерывании по Ctrl+C или закрывании окошка функция не отрабатывает. Можно было бы использовать расширение pcntl с его pcntl_signal(), но оно не работает под виндой, а скрипт работает как раз под ней. :[

Правильно ли я понимаю, что под виндой в консоли перехватить закрытие скрипта невозможно, или я всё-таки что-то упустил?

(Запасной вариант, понятное дело, проверять возраст .lock-файла и стирать его, если он слишком старый)
 

fixxxer

К.О.
Партнер клуба
В никсах я делаю следующим образом:

пишу .pid файл, внутри - pid запущенного процесса. при завершении удаляю.

при запуске проверяю:
1) если пидфайла нет - ок, продолжаем
2) если пидфайл есть - проверяю, запущен ли процесс с таким pid - шлю kill(0) этому pid.

Под виндами наверняка все то же самое можно сделать через [m]win32ps[/m]/[m]w32api[/m].
 

mity

Новичок
На самом деле всё проще

открываем файл, пытаемся его залочить
если залочили значить это первый запуск скрипта, не закрываем файл до окончания работы скрипта.
По окончанию работы скрипта php сам разлочит и закроет хендл скрипта, независимо от того как был завершён скрипт, в том числе и resetом

Под Windows XP, это прекрасно работает, под linux не проверял
PHP:
//Гдето в самом начале скпипта
 $hLock=@fopen($_SERVER['DOCUMENT_ROOT']."/lock.lock","a+b"); //Открываем файл по абсолютному пути
 if(!@flock ($hLock,LOCK_EX+LOCK_NB)){
   //Кто уже залочил файл, выходим
   die;
  };
 
//Больше скрипт никто не выполняет, можно работать
Под linux можно использовать
shmop_open, shmop_read, shmop_write
Скрип бы обновлял ячейку памяти записывая туда текущее время, если время в ячейке сильно отличается от текущего времени значит скрипт уже не выполняется
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: mity
На самом деле всё проще

открываем файл, пытаемся его залочить
если залочили значить это первый запуск скрипта, не закрываем файл до окончания работы скрипта.
По окончанию работы скрипта php сам разлочит и закроет хендл скрипта, независимо от того как был завершён скрипт, в том числе и resetом
О, спасибо огромное! Оказывается, зря я не дочитывал документацию до страницы про flock(). :]

Погонял, вроде работает всё как надо.
 
Сверху