Как по PID определить название скрипта - без CLI (*NIX системы само-собой) ?

E-van

Guest
Как по PID определить название скрипта - без CLI (*NIX системы само-собой) ?

Уважаемые, подскажите пожалуйста как решить "простенькую" задачку - необходимо по 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 мизерна - но все таки полностью исключать ее нельзя.

Как же по PID можно отловить название скрипта? Тогда можно будет сделать 100% надежную проверку.
Сразу оговорюсь - CLI на хосте нет, решение, которое было предложено тут:
http://ru.php.net/manual/en/function.posix-kill.php
(оттуда же и взял частичное решение вопроса) я принципиально не понял:

//You can get the $ProgramName from $argv[0]
$Result = shell_exec('ps x | grep "' . $PrevPid . '" | grep "' . $ProgramName . '" | grep -v "grep"');
Т.к. допустим на беспланых хостах PHP частенько запущен в safe mode - т.е. про shell_exec можно забыть, ну и я не совсем понял как здесь можно вообще вытащить название скрипта PHP, т.к. скрпты в шелле через ps обычно как процессы апача определяются и названием скрптов там вообще не пахнет (поправьте, если ошибаюсь).

Как-то же операционка сопоставляет PID названиям скриптов?
А как до туда добраться я пока не разобрался :(
 

E-van

Guest
tony2001

Хм.. а какой функцией можно вытащить это соответствие?
 

tony2001

TeaM PHPClub
т.е. ты уже посмотрел что в этом файле и теперь не знаешь как его прочесть?
 

Demiurg

Guest
а может проще создавать файл и лочить его ?
 

E-van

Guest
tony2001
Возможно я немного не понял сути дела - ты не мог бы привести код который по PID вытаскивает из ОС имя скрипта?
Немного не догнал что-то :(

Demiurg
Да я думал об этом варианте - но как о "последнем доводе королей" - т.е. можно конечно залочить файл куда PID складываем на все время выполнения скриптаи тут же сделать register-shutdown-function чтобы при завершении (или вылете) работы скрипта этот файл разлочивался.
Тогда не обязательно выколупывать по PID завание скрипта, а можно просто проверять залочен ли файл. Если да - то 1я копияя скрипта продолжает работать - т.е. закрываем только что запущенную 2ю копию, если нет - продолжаем работу, т.к. 1ая копия скрипта отработала.

Понятно, что так работать будет - но хотелось бы найти более элегантное решение (если, оно, конечно, есть) :)
 

Demiurg

Guest
А зачем в файл пид складывать ? Пока скрипт работает, он лочит файл, как только он отработал по своей или не своей воле, лок снимается.
 

E-van

Guest
Demiurg
Согласен - писал ответ уже в 5 утра - сразу не подумал, а потом уже не стал переписывать :)
 

E-van

Guest
young
Упс... точно tony2001 вполне недвусмысленно написал - можно было бы догадаться - надо завязывать по ночам не спать :)
 
Сверху