PHP Check ID процесса

Я полагаю, что это - потому что JPEG, с которым Вы работаете, является прогрессивным JPEG, который имеет различный тип пантомимы.

8
задан Ozzy 1 November 2009 в 11:23
поделиться

5 ответов

В linux вы бы посмотрели на /proc.[1252pting, в Windows вы могли бы shell_exec () tasklist.exe, и это обнаружило бы соответствующий идентификатор процесса:

$processes = explode( "\n", shell_exec( "tasklist.exe" ));
foreach( $processes as $process )
{
     if( strpos( "Image Name", $process ) === 0
       || strpos( "===", $process ) === 0 )
          continue;
     $matches = false;
     preg_match( "/(.*?)\s+(\d+).*$/", $process, $matches );
     $pid = $matches[ 2 ];
}

Я считаю, что вы хотите сохранить PID файл. В написанных мною демонах они проверяют файл конфигурации, ищут экземпляр файла pid, извлекают pid из файла pid, проверяют, существует ли / proc / $ pid, а если нет, удаляют pid файл.

   if( file_exists("/tmp/daemon.pid"))
   {
       $pid = file_get_contents( "/tmp/daemon.pid" );
       if( file_exists( "/proc/$pid" ))
       {
           error_log( "found a running instance, exiting.");
           exit(1);
       }
       else
       {
           error_log( "previous process exited without cleaning pidfile, removing" );
           unlink( "/tmp/daemon.pid" );
       }
   }
   $h = fopen("/tmp/daemon.pid", 'w');
   if( $h ) fwrite( $h, getmypid() );
   fclose( $h );

Идентификаторы процесса предоставляются ОС, и нельзя зарезервировать идентификатор процесса. Вы бы написали, что ваш демон уважает файл pid.

18
ответ дан 3 November 2019 в 14:37
поделиться

Лучшим способом добиться этого было бы использование pid или файла блокировки. Просто проверьте наличие файла pid, создайте его по мере необходимости и заполните его текущим pid.

<?
  class pidfile {
    private $_file;
    private $_running;

    public function __construct($dir, $name) {
      $this->_file = "$dir/$name.pid";

      if (file_exists($this->_file)) {
        $pid = trim(file_get_contents($this->_file));
        if (posix_kill($pid, 0)) {
          $this->_running = true;
        }
      }

      if (! $this->_running) {
        $pid = getmypid();
        file_put_contents($this->_file, $pid);
      }
    }

    public function __destruct() {
      if ((! $this->_running) && file_exists($this->_file)) {
        unlink($this->_file);
      }
    }

    public function is_already_running() {
      return $this->_running;
    }
  }
?>

И используйте его следующим образом:

<?
  $pidfile = new pidfile('/tmp', 'myscript');
  if($pidfile->is_already_running()) {
    echo "Already running.\n";
    exit;
  } else {
    echo "Started...\n";
  }
?>

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

6
ответ дан 3 November 2019 в 14:37
поделиться

Нет, вы не можете изменить идентификатор процесса. Он назначается ядром и является частью структур данных ядра

1
ответ дан 3 November 2019 в 14:37
поделиться

Не забывайте также, что вы можете получить доступ к командам оболочки через обратные кавычки (`), что даст вам доступ к стандартным инструментам * nix для работы с pid.

источник: http://www.php.net/manual/en/language.operators.execution.php

0
ответ дан 3 November 2019 в 14:37
поделиться

Как говорили другие, вы не можете изменить идентификатор процесса - он назначается и полностью управляется ядром ОС. Кроме того, вы не указали, используется ли это в командной строке или на веб-сервере: если последнее, возможно, вы даже не получаете pid своего скрипта.

Страница руководства для getmypid () содержит несколько примеров «оптимистической» блокировки. Я использую слово optimisitc, поскольку PHP никогда не приблизится к подобным веб-приложениям asp.net, где у вас есть настоящая многопоточная среда с общими / статическими классами и, следовательно, синглтоны для использования / злоупотребления. Обычно у вас есть возможность:

  • Прикоснуться к «файлу блокировки» где-нибудь в файловой системе. Затем ваш сценарий проверяет, существует ли этот файл: если он существует, прекратить, в противном случае прикоснуться к этому файлу и продолжить обработку
  • Установка флага на основе базы данных, чтобы сказать, что скрипт запущен. То же, что и выше, но используйте таблицу / поле базы данных, чтобы пометить сценарий как работающий.

Оба они полагаются на правильное завершение сценария (поскольку последним шагом будет удаление флага файла блокировки / базы данных). Если по какой-либо причине происходит сбой сценария (или самого компьютера), вам может потребоваться ручная очистка для удаления флага. Для этого нет простого решения, но можно было бы изучить один из способов - затем взглянуть на отметку даты на блокировке с помощью произвольного подхода «если старше X, последний запуск должен был дать сбой».

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

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

0
ответ дан 3 November 2019 в 14:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: