Запуск уникального процесса

autosoft

Новичок
Запуск уникального процесса

Понадобилось написать скрипт, который не допускал бы параллельное выполнение самого себя в одно и тоже время.
Сделал с использованием PID - в Unix все как надо, а вот в Windows появились вопросы.
Как в Windows узнать существует процесс с заданным PID или нет?

Для Windows расширения posix_* и pcntl_* недоступны.

Скрипт для иллюстрации к сказанному:

PHP:
<?php

function process_instance($cmd) {

    $posix = function_exists("posix_getpid");
    $file = ".lock";
    $result = false;

    switch ($cmd) {

        case "isset":
            if (@file_exists($file)) if ($posix) {

                if (is_numeric($pid = @file_get_contents($file)))
                if ($pid == (integer) $pid) $result = posix_kill($pid, 0);

            } else $result = true;
            break;

        case "create":
            if ($posix &&
                @file_exists($file) &&
                is_numeric($pid = @file_get_contents($file)) &&
                $pid == (integer) $pid &&
                !posix_kill($pid, 0)) @unlink($file);

            if (!@file_exists($file) && ($file = @fopen($file, "a"))) {

                $result = $posix ? @fwrite($file, posix_getpid()) : true;
                $result = @fclose($file) && $result;
            }
            break;

        case "free":
            $result = @file_exists($file) ? @unlink($file) : true;
            break;
    }

    return $result;
}

if (process_instance("create")) {

    // ...

    process_instance("free");
}

?>
 

autosoft

Новичок
C:\>TASKLIST /FI "PID eq 123"
Ошибка: Фильтр поиска не опознан.

Других решений нет?!
 

Андрейка

Senior pomidor developer
autosoft
Понадобилось написать скрипт, который не допускал бы параллельное выполнение самого себя в одно и тоже время
вообще-то ингода для этого используют flock, а не процессы перебирают
 

autosoft

Новичок
WP
Так что, в Unix можно без парсинга - posix_kill($pid, 0), а в windows обязательно свой парсинг придумывать нужно?
Глупо как-то. Меня больше интересовала какая-нибудь встроенная функция. Именно встроенная, а не свой парсинг.
А то можно дойти до того что ещё и ps через него пропускать :)
Но если таковой нет – то обойдемся без неё…

Андрейка
вообще-то ингода для этого используют flock, а не процессы перебирают
А пример можно?
 

DvR

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

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

Solid

Drosera anglica
Многие демоны так и делают, создают свой собственный *.pid файл.
 
Сверху