Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: shell/bash - как? [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: Передать аргумент процессу
EuGen Администратор
Отправлено: 08 Ноября, 2011 - 12:08:19
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar пишет:
У меня нет рута, а screen не установлен.

Значит попросите, чтобы установили. Мне кажется, причина весьма объективна. А именно - решать стандартными (для того и предназначенными вообще-то) средствами конкретно возникнувшую проблему.
Изобретать вот то - подобное написанному мной выше - можно, но мне кажется, это имеет скорее академический интерес, чем практическое применение.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 08 Ноября, 2011 - 15:28:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Вобщем вот такой, как выразился EuGen, "академический" велосипед получился.
ТП так и не оветила на установку screen.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4. declare(ticks = 1);
  5.  
  6. define("DS",DIRECTORY_SEPARATOR);
  7. define("PROC",realpath(dirname(__FILE__)).DS."proc".DS);
  8. define("IM",realpath(__FILE__));
  9. define("MYPID",getmypid());
  10.  
  11. class node {
  12.  
  13.         private $args;
  14.         private $procs = null;
  15.         private $files = null;
  16.         private $line = "---------------------------------------------------\n";
  17.  
  18.         public function __construct() {
  19.  
  20.                 $this->showHelp();
  21.  
  22.                 while (true) {
  23.                         clearstatcache();
  24.                         usleep(100000);
  25.                         $com = fgets(STDIN);
  26.                         if (trim($com) != "") $this->getAction(trim($com));
  27.                         }
  28.  
  29.                 }
  30.  
  31.         private function getAction($com) {
  32.  
  33.                 $this->getProcs();
  34.  
  35.                 switch ($com) {
  36.  
  37.                         case "quit":
  38.                                 die();
  39.                                 break;
  40.  
  41.                         case "killall":
  42.                                 $this->killAll();
  43.                                 break;
  44.  
  45.                         case "procs":
  46.                                 $this->showProcList();
  47.                                 break;
  48.  
  49.                         case "files":
  50.                                 $this->showFiles();
  51.                                 break;
  52.  
  53.                         default:
  54.                                 $this->getExtendCommand($com);
  55.                                 break;
  56.  
  57.                         }
  58.  
  59.                 }
  60.  
  61.         private function getExtendCommand($com) {
  62.  
  63.                 if (preg_match("#^kill\s+(\d+)$#",$com,$match)) {
  64.                         $this->kill($match[1]);
  65.                         echo $this->line;
  66.                         }
  67.  
  68.                 elseif (preg_match("#^start\s+(\w+.php)\s+-s\s+([\w\S]+)\s+-d\s+([\w\S]+)$#",$com,$match)) {
  69.  
  70.                         $args = PROC.$match[1]." ".$match[2]." ".$match[3];
  71.                         exec("php $args 1>> /dev/null 2>> /dev/null &");
  72.  
  73.                         echo "Started: $args\n";
  74.                         echo $this->line;
  75.  
  76.                         }
  77.  
  78.                 else $this->showHelp($com);
  79.  
  80.                 }
  81.  
  82.         private function getFileStatus($file) {
  83.  
  84.                 $this->getProcs();
  85.  
  86.                 if ($this->procs !== null) {
  87.  
  88.                         $c = 0;
  89.                         foreach ($this->procs as $proc)
  90.                                 if ($proc['path'] == $file) $c++;
  91.  
  92.                         return ($c > 0) ? "work ($c)" : "        ";
  93.  
  94.                         }
  95.  
  96.                 return "        ";
  97.  
  98.                 }
  99.  
  100.         private function getProcs() {
  101.  
  102.                 $this->procs = null;
  103.  
  104.                 exec("ps -A -F | grep php",$list);
  105.                 $n = 0;
  106.  
  107.                 if (count($list) > 0) {
  108.  
  109.                         foreach ($list as $item) {
  110.  
  111.                                 if (preg_match("#^(\w+)\s+(\d+).+(".PROC."[\w\S]+).*$#",$item,$match)) {
  112.  
  113.                                         if ($match[2] != MYPID and !stristr($match[3],IM)) {
  114.  
  115.                                                 $this->procs[$n]['user'] = $match[1];
  116.                                                 $this->procs[$n]['pid'] = $match[2];
  117.                                                 $this->procs[$n]['path'] = $match[3];
  118.  
  119.                                                 $n++;
  120.  
  121.                                                 }
  122.  
  123.                                         }
  124.  
  125.                                 }
  126.  
  127.                         }
  128.  
  129.                 }
  130.  
  131.         private function showFiles() {
  132.  
  133.                 $this->getProcs();
  134.                 $this->getFiles();
  135.  
  136.                 echo $this->line;
  137.                 if ($this->files !== null) {
  138.  
  139.                         foreach ($this->files as $id => $file) {
  140.  
  141.                                 $status = ($this->procs === null)
  142.                                         ? "    " : $this->getFileStatus($file['file']);
  143.  
  144.                                 echo "$status #$id: ".$file['name']."\n";
  145.  
  146.                                 }
  147.  
  148.                         }
  149.                 else echo "Empty..\n";
  150.                 echo $this->line;
  151.  
  152.                 }
  153.  
  154.         private function getFiles() {
  155.  
  156.                 $n = 0;
  157.  
  158.                 foreach (glob(PROC."*.php") as $file) {
  159.  
  160.                         $this->files[$n]['file'] = $file;
  161.                         $this->files[$n]['name'] = str_replace(PROC,"",$file);
  162.  
  163.                         $n++;
  164.  
  165.                         }
  166.  
  167.                 }
  168.  
  169.         private function showProcList() {
  170.  
  171.                 echo $this->line;
  172.                 if ($this->procs !== null) {
  173.  
  174.                         foreach ($this->procs as $id => $proc)
  175.                                 echo "#$id: ".$proc['user']." - ".
  176.                                         $proc['pid']." - ".$proc['path']."\n";
  177.  
  178.                         }
  179.  
  180.                 else echo "Empty...\n";
  181.  
  182.                 echo $this->line;
  183.  
  184.                 }
  185.  
  186.         private function killAll() {
  187.  
  188.                 if ($this->procs !== null)
  189.                         foreach ($this->procs as $item)
  190.                                 $this->kill($item['pid']);
  191.  
  192.                 echo $this->line;
  193.                 }
  194.  
  195.         private function kill($pid) {
  196.  
  197.                 exec("kill -9 $pid");
  198.                 echo "stop process $pid\n";
  199.  
  200.                 }
  201.  
  202.         private function showHelp($com = "") {
  203.  
  204.                 echo $this->line;
  205.                 if ($com != "") echo "unknown argument '$com'\n";
  206.                 echo "usage: procs | files\n";
  207.                 echo "       start [filename.php] -s [source db.table] -d [destination db.table]\n";
  208.                 echo "       kill [pid] | killall | quit\n";
  209.                 echo $this->line;
  210.  
  211.                 }
  212.  
  213.         }
  214.  
  215. echo "\n";
  216. $node = new node;
  217. echo "\n\n";
  218.  
  219. ?>
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Ноября, 2011 - 06:18:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




ТП в прострации, на велосипеде ездию уже два дня.
Полет нормальный, столбы не сшибаю, коленки не разбил... Радость
 
 Top
EuGen Администратор
Отправлено: 10 Ноября, 2011 - 08:11:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar пишет:
exec("kill -9 $pid");

Сильно. Даже не даете ему опомниться.
Далее, зачем сразу, без запроса showHelp в конструкторе делаете? Оно, может, и позволяет узнать команды, но обычно помощь предоставляется "по требованию"
Вместо \n лучше использовать PHP_EOL
Ну и поддержка Win неплоха была бы (PHP_OS=='WINNT')


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Ноября, 2011 - 10:43:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
Сильно. Даже не даете ему опомниться.
Подскажите другой вариант. Я правда не знаю как это сделать иначе.
 
 Top
EuGen Администратор
Отправлено: 10 Ноября, 2011 - 10:47:04
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Имелоссь ввиду - почему -9 ? Почему не просто kill ? (Может, на то есть какая-то причина, которую я не увидел)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 10 Ноября, 2011 - 10:53:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Чтоб наверняка.
Хотя я не разу еще не "килял" ни одного из запускаемых процессов, все отрабатывали до конца.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Администрирование *nix »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB