Уникальный индификатор запущенной программы (скрипта)

Pingvin22

Новичок
Уникальный индификатор запущенной программы (скрипта)

Слышал что скрипт может получить свой уникальный индификатор приложения в никсах (вроде ПИД он называется), как его получить?

И еще естьли чтото подобное в окнах?


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

Valdemar_UA

Новичок
Re: Уникальный индификатор запущенной программы (скрипта)

При запуске скрипта можно в какой-нибудь директории создавать файлик myprogram.pid в которую записываешь идентификатор (В никсах этот идентификатор выдает система) процесса, думаю в винде система похожая.

При повторном(да и при любом) запуске скрипта проверяешь существует ли данный файл и существует ли процесс с указанным пидом...


ЗЫ Или вопрос был в том как получить идентификатор процесса под виндой :)?
 

Pingvin22

Новичок
Автор оригинала: Фанат
подробнее
При запуске скрипта нужно проверять незапущена ли его копия, если запущена делать kill, если не запущена записать кудато уникальный индификатор и дальше работать. Дело в том что нужно чтобы этот скрипт работал и никсах и в окнах.

Я так понимаю что мне нужна функция getmypid() но в окнах она выдает одно и тоже число.

Автор оригинала: Valdemar_UA
ЗЫ Или вопрос был в том как получить идентификатор процесса под виндой ?
окна = винда = windows = билл гейтс :)
 

Фанат

oncle terrible
Команда форума
о господи.
в ответ на просьбу написать подробнее повторять тот же самый текст слово в слово - выглядит, как издевка
что, хотя бы, имеется в виду под словами "запуск скрипта"?!
 

Valdemar_UA

Новичок
Да я уже понял, что невнимательно прочитал вопрос...

Я так понимаю что мне нужна функция getmypid() но в окнах она выдает одно и тоже число.
У меня getmypid() при каждом выполнении скрипта отдает разные значения.
 

Pingvin22

Новичок
Автор оригинала: Фанат
о господи.
в ответ на просьбу написать подробнее повторять тот же самый текст слово в слово - выглядит, как издевка
что, хотя бы, имеется в виду под словами "запуск скрипта"?!
Ну не слово в слово ... а вообще просто не понял что тебе непоятно...

"Запуск скрипта" под этим имеятся ввиду два варианта запуска php интерпритатора
1. Набирание в броузере адреса и посылка get запроса apache`у ( в этом случает php интерпритатор будет вызван apache`м)
2. Запуск скрипта по заданию в cron`e (в этом случае php интерпритатор будет вызываться напримую без участия apache`а)

понятно объясняю?


Автор оригинала: Valdemar_UA
У меня getmypid() при каждом выполнении скрипта отдает разные значения.
в винде?
 

KaYSer

Новичок
хм.. а что у тебя за винда? у меня getmypid() тоже выводит нормально pid
 

Макс

Старожил PHPClub
Данную задачу можно и без pid-ов решить :
http://phpclub.ru/talk/showthread.php?s=&threadid=97318
http://phpclub.ru/talk/showthread.php?s=&threadid=97367
 

Valdemar_UA

Новичок
Windows XP SP2, PHP 5.2.0 - getmypid() срабатывает нормально.
Ну хорошо пид текущего процесса мы получим, запишем его в файл myprogram.pid, но вот как под виндой проверить, что процесс с данным пидом запущен? Ведь скрипт может аварийно отвалится и не удалить файлик myprogram.pid.
Я не нашел решения по виндовс(имею ввиду просмотр текущих процессов)....

Вот еще один возможный вариант решения твоей задачи:
http://mkdir.livejournal.com/7484.html
 

romy4

invoke [brain]
для никсов получение пида запущеной проги:
PHP:
$pid=`ps ax | awk '/$fname/ && !/awk/{print \$1}' `;
для винды:
PHP:
$str=`tasklist /NH /FI "IMAGENAME eq $fname"`;
$exploded=preg_split("/[\t\x20]+/",$str);
$pid=$exploded[1];
дальше разберешься
 

Valdemar_UA

Новичок
Кстати, не знал, что в винде есть консольная утилита показывающая активные процессы..

Спасибо.
 

romy4

invoke [brain]
Valdemar_UA
в винде есть достаточно много чего, удручает, правда, отсуствие grep'a
 

Pingvin22

Новичок
Автор оригинала: KaYSer
хм.. а что у тебя за винда? у меня getmypid() тоже выводит нормально pid
Автор оригинала:Valdemar_UA
Windows XP SP2, PHP 5.2.0 - getmypid() срабатывает нормально.
У Меня тоже винда XP SP2, PHP 5.2.1 Apache 2.2
Открываю три окна броузера запускаю однавременно вот этот код,

PHP:
<?php  
echo getmypid();
$timestart=time();
while((time()-$timestart)<15)
{}
?>
Все ПИДы Одинаковые! Я так понимаю это из за того что у меня php подключен как модуль apache`а и pid выдается не скрипта а апачевский. Если апачь перезапустить pid выдается другой но одинаковый.


Автор оригинала: Макс
Данную задачу можно и без pid-ов решить :
http://phpclub.ru/talk/showthread.php?s=&threadid=97318
http://phpclub.ru/talk/showthread.php?s=&threadid=97367
Можно. Но помоему ПИДы самый оптимальный вариант. А flock совсем не лучший вариант.

Автор оригинала: Макс

для никсов получение пида запущеной проги:

$pid=`ps ax | awk '/$fname/ && !/awk/{print \$1}' `;

для винды:

$str=`tasklist /NH /FI "IMAGENAME eq $fname"`;
$exploded=preg_split("/[\t\x20]+/",$str);
$pid=$exploded[1];

дальше разберешься
в винде проблема в том что в tasklist`е, когда мы запускаем скрипт через броузер, этот скрипт не появляется как отдельное приложение, а выполняется в рамках httpd.exe и поэтому мы не может получить его пид. Как я уже выше писал, я так понимаю что это из затого что у меня php подключен как модуль апача, но подключить его некак модуль непредстовляется возможным.
 

romy4

invoke [brain]
Pingvin_22
а тебе надо скрипт по крону запускать или будет запускаться по запросу из браузера?
 

Pingvin22

Новичок
Автор оригинала: romy4
Pingvin_22
а тебе надо скрипт по крону запускать или будет запускаться по запросу из браузера?
Запускаться должен и так и сяк в зависимости от обстоятельств. Поначалу будет запускаться на винде через броузер.
 

Valdemar_UA

Новичок
romy4, все вопросы к Pingvin22 :).

Хм. А из крона этот скрипт точно нельзя запустить?
 

romy4

invoke [brain]
Pingvin22
просто если изначально известно, что он будет запускаться только по крону (во всяком случае, не из браузера), то не стоит себе ломать голову над поиском унификатора процесса при работе с апачем. тестируй себе в коммандной строке.
 

Pingvin22

Новичок
Автор оригинала: Valdemar_UA
Хм. А из крона этот скрипт точно нельзя запустить?
Автор оригинала: romy4
Pingvin22
просто если изначально известно, что он будет запускаться только по крону (во всяком случае, не из браузера), то не стоит себе ломать голову над поиском унификатора процесса при работе с апачем. тестируй себе в коммандной строке.
Дело в том что совсем не известно где кем и как он будет запускаться, поэтому надо чтоб он был универсальный!

Мне кажется что у апача должен быть какойто индификатор внутренних процессов, который можно использовать как пид. Кто бы мне про это чтонибуть рассказалбы...
 

Valdemar_UA

Новичок
Тут идея появилась. Если нужно запускать из под браузера пиды не катят. Может использовать переменную сессии?

1. Ты запускаешь, допустим localhost/my.php
2. апач отдал тебе твой айди сессии
3. ты его пишешь в файл my.current_session
4. при повторном запуске скрипта, проверяешь есть ли в каталоге в котором сохраняются файлы сессий файл имя которого соответствует строке из my.current_session (один ньюанс - сессия должна быть другой, но я так понимаю, что скрипт будет запускаться нечасто и это не должно быть проблемой?)

Но, ИМХО, правильней было бы запускать это добро из крона....
 
Сверху