Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2013, 16:48   #1
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию exec и зависшая команда.

Через exec запускаю консольную программу. Все это дело крутится в цикле, большом причем - бывает процесс подвиснет и ступорит весь цикл.

1. Как вообще можно в php определить или завис процесс?
2. Если мы определили, что процесс все таки завис - грохнуть процесс, ну есное дело по id процесса.

А, ну и ОС на каком это все проделывается - Linux.


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

Код:
function PsExecute($command, $timeout = 10, $sleep = 1, $file_out_put = '/dev/null') {

	    $pid = PsExec($command, $file_out_put);

	    if( $pid === false ) {
	      return false;
	    }

	    $cur = 0;

	    // пока не истекло время отведенное на выполнение скрипта продолжаем ждать
	    while( $cur < $timeout ) {
	      sleep($sleep);
	      $cur += $sleep;

	      if( !PsExists($pid) ) {
	        // скрипт завершил своё выполнение, можно посмотреть его результат или просто вернуть true
	        if ($file_out_put != '/dev/null') {
	          return file_get_contents($file_out_put);
	        } else {
	          return true;
	        }
	      }
	    }

	    // не дождались пока звершиться скрипт, по этому автоматически убиваем его
	    PsKill($pid);
	    return false;
    }

  /**
   * Run process in background with out buffer to file
   * @param str $commandJob
   * @param str $file_out_put
   * @return int or false
   */
	function PsExec($commandJob, $file_out_put) {
		$command = $commandJob.' > '.$file_out_put.' 2>&1 & echo $!';
		exec($command ,$op);
		$pid = (int)$op[0];

		if($pid!="") return $pid;

		return false;
	}

  /**
   * If process exists then return true else return false
   * @param int $pid
   * @return bool
   */
	function PsExists($pid) {

		exec("ps ax | grep $pid 2>&1", $output);

		while( list(,$row) = each($output) ) {

		  $row_array = explode(" ", $row);
		  $check_pid = $row_array[0];

		  if($pid == $check_pid) {
		    return true;
		  }

		}

		return false;
	}

	/**
	 * Kill process
	 * @param int $pid
	 */
	function PsKill($pid) {
		exec("kill -9 $pid", $output);
	}
Запускаем нашу консольную программу
Код:
PsExecute($command, 120, 1, '/tmp/1.txt');
Имеем ошибку такого вида.
Код:
PHP Notice:  Undefined variable: command in /var/www/1.php on line 171
Думал грабли с '/tmp/1.txt' - типа лезу не в свою папку - указал уже в локальной папке проэкта '/var/www/1.txt'


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

Может все таки есть более простой способ, спасибо.
Небесный вне форума Ответить с цитированием
Старый 06.10.2013, 20:19   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

1. это не ошибка, переведите переводчиком
просто предупреждает, что некая переменная не определена, можно игнорировать, но лучше посмотреть - что там у вас в 171 строке за переменная, и не нужно ли ей какое то значение присвоить
ADSoft вне форума Ответить с цитированием
Старый 07.10.2013, 06:47   #3
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
1. это не ошибка, переведите переводчиком
просто предупреждает, что некая переменная не определена, можно игнорировать, но лучше посмотреть - что там у вас в 171 строке за переменная, и не нужно ли ей какое то значение присвоить
Ну, вообще то да. Не так выразился. ((( Как бы там небыло нотис, не нотис, я стараюсь их недопускать, но иногда забиваю. Функция одним словом не работает.
Небесный вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция exec (Python 3.3.2) NiceNick Python 10 07.09.2022 15:04
Нубовопрос: insert-exec и rollback Ksardas13 SQL, базы данных 0 13.10.2012 17:58
Команда System: запуск программы в свёрнутом режиме, Не работает команда /min Me777 Общие вопросы C/C++ 0 12.07.2011 11:49
Проблема с вызовом exec() из php на linux Fatum123 PHP 6 13.04.2009 22:36
exec sergei64_89 SQL, базы данных 2 12.12.2008 12:04