E-van
Guest
Как по PID определить название скрипта - без CLI (*NIX системы само-собой) ?
Уважаемые, подскажите пожалуйста как решить "простенькую" задачку - необходимо по PID процесса определить название скрипта, которому этот PID присвоен?
В кратце объясню зачем - при запуске скрипта делаю 100% гарантированную проверку того, что этот скрипт уже не запущен (довольно часто встречающаяся задача - особенно, если нужно что-то куда-то писать - в базу или в файлы). Скрипт запускается кроном и в зависимости от ситуации может либо успеть отработать до следющего перезапуска, либо не успеть.
Пока нашел более-менее удовлетворительное решение этого вопроса таким образом:
В общем, конечно, вероятность того, что при следующем перезапуске скрипт уже загнется, а другому скрипту будет присвоен точно такой же PID мизерна - но все таки полностью исключать ее нельзя.
Как же по PID можно отловить название скрипта? Тогда можно будет сделать 100% надежную проверку.
Сразу оговорюсь - CLI на хосте нет, решение, которое было предложено тут:
http://ru.php.net/manual/en/function.posix-kill.php
(оттуда же и взял частичное решение вопроса) я принципиально не понял:
Как-то же операционка сопоставляет PID названиям скриптов?
А как до туда добраться я пока не разобрался
Уважаемые, подскажите пожалуйста как решить "простенькую" задачку - необходимо по PID процесса определить название скрипта, которому этот PID присвоен?
В кратце объясню зачем - при запуске скрипта делаю 100% гарантированную проверку того, что этот скрипт уже не запущен (довольно часто встречающаяся задача - особенно, если нужно что-то куда-то писать - в базу или в файлы). Скрипт запускается кроном и в зависимости от ситуации может либо успеть отработать до следющего перезапуска, либо не успеть.
Пока нашел более-менее удовлетворительное решение этого вопроса таким образом:
PHP:
$mypidfile="PID.txt";
$a = getmypid();
$pid = fopen($mypidfile, "r");
$pidlength = filesize($mypidfile);
$mypid = fread($pid,$pidlength);
fclose($pid);
$PrevPid = rtrim($mypid);
// Определяем есть ли уже запущенный процесс с таким PID - если есть - завершаем работу скрипта
if(($PrevPid !== FALSE) && posix_kill($PrevPid,0)):
die;
else:
//Процесса с таким PID нет - полностью переписываем файл и продолжаем работу дальше
$pid=fopen($mypidfile, "w");
fwrite($pid, $a);
fclose($pid);
endif;
bla-bla......
Как же по PID можно отловить название скрипта? Тогда можно будет сделать 100% надежную проверку.
Сразу оговорюсь - CLI на хосте нет, решение, которое было предложено тут:
http://ru.php.net/manual/en/function.posix-kill.php
(оттуда же и взял частичное решение вопроса) я принципиально не понял:
Т.к. допустим на беспланых хостах PHP частенько запущен в safe mode - т.е. про shell_exec можно забыть, ну и я не совсем понял как здесь можно вообще вытащить название скрипта PHP, т.к. скрпты в шелле через ps обычно как процессы апача определяются и названием скрптов там вообще не пахнет (поправьте, если ошибаюсь).//You can get the $ProgramName from $argv[0]
$Result = shell_exec('ps x | grep "' . $PrevPid . '" | grep "' . $ProgramName . '" | grep -v "grep"');
Как-то же операционка сопоставляет PID названиям скриптов?
А как до туда добраться я пока не разобрался
