как проверить запущен ли скрипт?

banshi12

Новичок
как проверить запущен ли скрипт?

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

ps: поиск юзал - ответа не нашел:(
http://phpclub.ru/talk/showthread.php?s=&threadid=79269
http://phpclub.ru/talk/showthread.php?s=&threadid=76408
 

SiMM

Новичок
> поиск юзал - ответа не нашел
Чем [m]flock[/m] не подошел?
 

banshi12

Новичок
хммм....ну если при прерывание скрипта он снимается то подходит:)

-~{}~ 29.01.06 14:59:

а если flock не работает на хосте? возможны другие варианты?
 

Solid

Drosera anglica
Для себя вижу только одно решение. Брать всю информацию через ps -aux и дальше искать этот скрипт через "поиск в тексте".
 

white phoenix

Новичок
Solid
> Для себя вижу только одно решение. Брать всю информацию через ps -aux и дальше искать этот скрипт через "поиск в тексте".
Обои клеить собрался через замочную скважину. Зачем в этом случае "поиск в тексте" (как я понимаю средствами PHP), ведь достаточно `ps -aux | grep script.php`. Через список процессов отследить скрипт можно только при PHP-CGI.
banshi12
Как это [m]flock[/m] не работает?
 

banshi12

Новичок
ну вот я проверял - запустил такой скрипт
PHP:
$fp=fopen("test.txt","w");
flock($fp,2);
fwrite($fp,"sssss");

for($i=0;$i<1000;$i++)
{
	echo $i."<br>";
	flush();
	sleep(10);
}
fclose($fp);
во время его работы другим скриптом считываю из этого файла , и спокойно считывается:(
 

white phoenix

Новичок
banshi12
> flock($fp,2);
> спокойно считывается
2 - LOCK_EX - запрет записи, а не чтения.
 

banshi12

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

SiMM

Новичок
> во время его работы другим скриптом считываю из этого файла , и спокойно считывается
PHP поддерживает портируемый механизм запирания файлов целиком, который имеет рекомендательный характер (это означает, что все обращающиеся к файлу программы должны использовать такой же способ запирания файла, иначе запирание не сработает).
Так что "другим скриптом" без приведения оного за аргумент ну никак не катит.

> 2 - LOCK_EX - запрет записи, а не чтения.
Для получения исключительной/exclusive блокировки (writer) установите в operation значение LOCK_EX
Предлагаю подумать на досуге над значением слова "исключительно".
PHP:
$fp = fopen(__FILE__,'r');
if (!flock($fp,LOCK_EX|LOCK_NB)) die('File is already locked');
...
-~{}~ 30.01.06 01:11:

white phoenix, чтобы было понятнее - http://php.spb.ru/php/flock.html
flock (дексриптор файла, режим)
режим:
1 - другие процессы могут отрыть только в режиме чтения
2 - другие процессы ничего не могут
3 - снять блокировку
 

banshi12

Новичок
2 SiMM

вот скрипт которым проверял
PHP:
$fname="test.txt";
$fp=fopen($fname,"w");
$k=fwrite($fp,"check");
fclose($fp);
в файл записывалось

тот вариант что ты дал работает, спасибо:)))

-~{}~ 30.01.06 08:49:

блин
не получается обьединить в 1 файл:
вот так, в 2х файлах работает
файл который лочит
PHP:
set_time_limit(0);
$fp=fopen("test.txt","w");
flock($fp,2);
fwrite($fp,"sssss");

for($i=0;$i<5;$i++)
{
	echo $i."<br>";
	flush();
	sleep(10);
}
fclose($fp);
который проверяет
PHP:
$fname="test.txt";
$fp=fopen($fname,"r");
if (!flock($fp,LOCK_EX|LOCK_NB))
{ 
	die('File is already locked'); 
}else 
{
	die('nolock');
}
а вот так вот, в одном скрипте не работает - вторая копия просто ждет когда первая закончит , а не останавливается:(
PHP:
set_time_limit(0);
function DoMain()
{
	$checkfile="check";
	
	// checking if script working
	$fp=fopen($checkfile,"r");
	
	if (!flock($fp,LOCK_EX|LOCK_NB))
	{
		die('Script Already working');
	}else 
	{
		fclose($fp);
		echo 'no lock';	
	}
	//end checking
	
	//creating lock
	$fp=fopen($checkfile,"w");
	flock($fp,2);
	fwrite($fp,"wwwww");

	//main script here
	for($i=0;$i<5;$i++)
	{
		echo $i;
		flush();
		sleep(5);
	}
	
	//end main script
	
	fclose($fp);
}

DoMain();
 

SiMM

Новичок
Читайте ман. По [m]flock[/m]. И ссылку на Бородина. До полного просветления. Судя по вашему коду - вы так и не врубились, что к чему, а просто бездумно сделали copy&paste. Я не давал вам готового решения. Под вашу задачу. Я показал вам пример. Только и всего. Дальше лишь остаётся доработать его напильником под себя. При чём ничего сложного в этой доработке нет. Надо только понять, зачем и когда нужен flock.
 

banshi12

Новичок
все, заработало:) мозилла глючила просто, через ie все нормально:)
еще раз спасибо большое за помощь:)
вот скрипт - может кому пригодиться
PHP:
<?
set_time_limit(0);
$checkfile="c.txt";
$fp=fopen($checkfile,"w");
if (!flock($fp,LOCK_EX|LOCK_NB))
{
	die('Script Already working');
}else
{
	//main script here
	for($i=0;$i<5;$i++)
	{
		echo $i;
		flush();
		sleep(10);
	}

	//end main script

	fclose($fp);
}
?>
 

SiMM

Новичок
banshi12, это не мозилла глючила. Сравни свой последний скрипт с предыдущим, и почувствуй СУЩЕСТВЕННУЮ разницу.
 

whirlwind

TDD infected, paranoid
по нормальному это делается путем записи pid процесса в файл. а зная pid можно проверить статус.
 

Alexandre

PHPПенсионер
Запускается через крон и проверяет наличие определенного файла, и если он есть то значит скрипт работает уже и вторая копия не запускается.
глупый ответ, но каков вопрос: сделай интервал запуска реже.

-~{}~ 01.02.06 15:47:

Есть способ обойти такую ситуацию
а) memcache - если хостер установит...
в) используй БД
 
Сверху