Intereting Posts
Как проверить электронную почту на PHP? Вызов mysql ПРОЦЕДУРЫ внутри цикла while работает только в первый раз Добавление чата через websocket, к существующему веб-приложению PHP DOMDocument / Xpath утечка памяти при длительном процессе командной строки – любой способ деконструировать этот класс Образцы инъекций зависимостей кажутся экстремальными в классе управления Отправка электронной почты с помощью Mandrill с использованием PHP Laravel Mail :: send () отправка нескольких адресов или адресов как иметь 64-битное целое число на PHP? невозможно сравнивать данные из базы данных с массивом строк Как подготовить оператор SQL с помощью POINT с помощью mysqli при использовании INSERT Сохранение информации из открытого идентификатора facebook CodeIgniter: Страница не найдена при передаче параметров контроллеру? Должен ли я использовать статические классы и что является преимуществом (или недостатком)? Yii: отношение n: m по обе стороны от AR Не удалось загрузить запрошенный класс: сеанс

Как получить список процессов PHP, работающих на сервере с PHP

У меня есть cronjob, который запускает PHP-файл, который запускает DAEMON, написанный на PHP, но я хочу только запустить DAEMON, если нет других его экземпляров, как я могу получить список запущенных процессов PHP, чтобы узнать, DAEMON работает. Я думал о каком-то exec, который будет генерировать список, который я могу хранить в массиве. Есть идеи? благодаря

Для получения списка процессов PHP см. Этот вопрос:

Как получить список запущенных php-скриптов с помощью PHP exec ()?

Другой вариант заключается в том, что вы можете получить блокировку файла, а затем проверить его перед запуском: например:

$thisfilepath = $_SERVER['SCRIPT_FILENAME']; $thisfilepath = fopen($thisfilepath,'r'); if (!flock($thisfilepath,LOCK_EX | LOCK_NB)) { customlogfunctionandemail("File is Locked"); exit(); } elseif(flock($thisfilepath,LOCK_EX | LOCK_NB)) // Acquire Lock { // Write your code // Unlock before finish flock($thisfilepath,LOCK_UN); // Unlock the file and Exit customlogfunctionandemail("Process completed. File is unlocked"); exit(); } 

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

благодаря

Вот мое полное решение взять на себя управление cron с php-скриптом, который включает mysql db для настройки и ведения журнала. Вы должны найти ответы на свои вопросы в исходном коде.

Класс Cron_Job:

 class Cron_Job { /** * check if job is still running * @param int $pid * @return boolean */ public function isJobRunning($pid) { try { $result = shell_exec(sprintf("ps %d", $pid)); if (count(preg_split("/\n/", $result)) > 2) { return true; } } catch (Exception $e) { } return false; } /** * deletes job from run stack * @param int $pid */ public function deleteRunningJob($pid) { $sql = "delete from croner_running_pids where pid = '$pid'"; $ret = framework_Database::getInstance("****")->delete($sql); } /** * adds job into run stack * @param int $pid */ public function addRunningJob($pid, $outputfile) { $sql = "insert into croner_running_pids (pid, `outfile`) values ('$pid', '$outputfile')"; $id = framework_Database::getInstance("****")->insert_db($sql); } } 

класс Cron_Log:

 class Cron_Log { public static function setRunLog($jobid, $message) { $date = date("Ymd H:i:s"); $sql = "insert into croner_run_log (jobid, cas, message) values ('$jobid', '$date', '$message')"; framework_Database::getInstance("****")->insert($sql); } /** * sets first run of job log * @param int $jobid * @param int $pid * * @return $id */ public static function setJobLogStart($jobid, $pid) { $start = date("Ymd H:i:s"); $sql = "insert into croner_log (job_id, start_run, pid) values ('$jobid', '$start', '$pid')"; $id = framework_Database::getInstance("****")->insert_db($sql); return $id; } /** * finalize log for specified run * @param int $logid */ public static function setJobLogEnd($pid, $endRunTime, $message) { $endRunTime = date("Ymd H:i:s", $endRunTime); $message = mysql_real_escape_string($message); $sql = "update croner_log set end_run = '$endRunTime', output = '$message' where pid = '$pid' and end_run is null"; framework_Database::getInstance("****")->update($sql); } } 

исполняемый скрипт:

 $sql = "select id, runtime, execute_path from croner where runtime is not null and execute_path is not null"; //I am using database wrapper $ret = framework_Database::getInstance("****")->select($sql); $cj = new Cron_Job(); //echo date('dmYNW H:i:s'); echo "<br>"; if(count($ret['id']) > 0) { foreach($ret['id'] as $key=>$id) { $runtime = $ret['runtime'][$key]; if(empty($runtime)) continue; $cmd = $ret['execute_path'][$key]; $outputfile = "/var/www-intranet/croner/outputs/" . $id . "_" . time(); //echo $runtime; //if pregmatch than get details if(preg_match($runtime, date('dmYNW H:i'), $matches)) { Cron_Log::setRunLog($id, "Starting job $cmd"); $cmd = sprintf("%s > %s 2>&1 & echo $!", $cmd, $outputfile); exec($cmd, $pid); $pid = $pid[0]; //add log that job has started $cj->addRunningJob($pid, $outputfile); Cron_Log::setJobLogStart($id, $pid); usleep(2000); } else { continue; } } } sleep(1); //check running pids $sql = "SELECT * FROM croner_running_pids"; $ret = framework_Database::getInstance("****")->select($sql); //print_r($ret); if(isset($ret['pid']) && count($ret['pid'])) { foreach($ret['pid'] as $key=>$pid) { if(is_numeric($pid) && !$cj->isJobRunning($pid) && file_exists($ret['outfile'][$key])) { //delete pid from run table $cj->deleteRunningJob($pid); $outfile = $ret['outfile'][$key]; $endRunTime = filemtime($outfile); //echo $endRunTime; $message = file_get_contents($outfile); Cron_Log::setJobLogEnd($pid, $endRunTime, $message); @unlink($outfile); } } } 

Таблицы БД:

Стол:

 Field Type Null Key Default Extra id int(11) NO PRI NULL auto_increment jobname varchar(250) NO NULL descr text NO NULL runtime varchar(150) NO NULL execute_path text NO NULL creator int(11) NO NULL last_run_time timestamp NO CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 

Таблица Croner_log:

 Field Type Null Key Default Extra id int(11) NO PRI NULL auto_increment job_id int(11) NO NULL start_run timestamp YES NULL end_run timestamp YES NULL pid int(11) NO NULL output longtext NO NULL 

Таблица croner_run_log:

 Field Type Null Key Default Extra id int(11) NO PRI NULL auto_increment jobid int(11) NO NULL cas timestamp NO CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP message varchar(255) NO NULL 

Таблица croner_running_pids:

 Field Type Null Key Default Extra id int(11) NO PRI NULL auto_increment pid int(11) NO NULL pidfile varchar(250) NO NULL outfile varchar(250) NO NULL 

Идея состоит в том, чтобы иметь конфигурацию в базе данных, где я сохранил шаблоны для preg_match в определенном формате ( date ('dmYNW H: i: s') ). Этот скрипт запускается каждую минуту.

Затем я всегда выбираю все шаблоны и сопоставляю их с результатами функции даты.

Если совпадение найдено, я запустил команду, сохраненную для этого задания, – поместите ее в фоновом режиме и сохраните ее pid в базу данных – отдельную таблицу, в которой хранятся все выходы из заданий.

В конце я проверяю базу данных для заданий, которые отмечены как выполняющиеся и ищущие, если они все еще находятся в списке процессов.