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 - как?

 PHP.SU

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


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

> Описание: Передать аргумент процессу
DeepVarvar Супермодератор
Отправлено: 07 Ноября, 2011 - 15:39:00
Post Id



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


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


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




Как передать аргумент уже работающему php-процессу?
На старте да, так:
Спойлер (Отобразить)

PID известен.
Не зомби и не демон, просто долго выполняется.
 
 Top
dzubchik
Отправлено: 07 Ноября, 2011 - 15:51:31
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Июль 2010  


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




а такое возможно?
 
 Top
DeepVarvar Супермодератор
Отправлено: 07 Ноября, 2011 - 16:12:08
Post Id



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


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


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




Повесить свой обработчик на один из сигналов,
например, SIGSTOP не катит - он не может нести информацию,
он сам есть информация.
(Добавление)
Может как-то можно через stdin по PID'у?
 
 Top
EuGen Администратор
Отправлено: 07 Ноября, 2011 - 16:20:29
Post Id


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


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


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




Через сигналы никак (сигнал несет в себе только целое число - собственно свой код)
Если скрипт сам не понимает (заранее), то уже не передать.
Однако можно сделать что-то наподобие вот такого костыля:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. declare(ticks = 1);
  3.  
  4. $iWait=10;
  5. $iParam=$_SERVER['argv'][1];
  6. pcntl_signal(SIGHUP, function ($signal) use (&$iParam)
  7. {
  8.         $iParam=file_get_contents('write');
  9.         echo '!Caught SIGHUP, updating parameters.. '.PHP_EOL;
  10. });
  11. while(true)
  12. {
  13.         echo('Handling data parameter: '.$iParam.PHP_EOL);
  14.         sleep($iWait);
  15. }
  16.  

Тогда будет так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Handling data parameter:
  2. Handling data parameter:
  3. Handling data parameter:
  4. Handling data parameter:
  5. Handling data parameter:
  6. !Caught SIGHUP, updating parameters..
  7. Handling data parameter: 12
  8.  
  9. Handling data parameter: 12

- в ответ на команду

- естественно, в файл данные были записаны до отсылки сигнала.


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



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


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


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




EuGen Закатив глазки я только ушел от файлов... Но не важно. Это мысль.. Разбирать буду уже завтра - рабочий день кончился уже как 25 мин назад..
Отпишу как получилось. Закатив глазки
(Добавление)
Писать буду не в файл, а в память, там хоть залочить можно по человечески..
Можно кстати и через lock сегмента попробовать.
Смысл тот же - действие на событие.
(Добавление)
Плюсанул Закатив глазки
 
 Top
EuGen Администратор
Отправлено: 07 Ноября, 2011 - 16:37:58
Post Id


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


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


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




Можно хитрее:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. declare(ticks = 1);
  3.  
  4. $iWait=10;
  5. $iParam=$_SERVER['argv'][1];
  6. pcntl_signal(SIGHUP, function ($signal) use (&$iParam)
  7. {
  8.         $iParam=fgets(STDIN);
  9.         echo '!Caught SIGHUP, updating parameters.. '.PHP_EOL;
  10. });
  11. while(true)
  12. {
  13.         echo('Handling data parameter: '.$iParam.PHP_EOL);
  14.         sleep($iWait);
  15. }

Тогда:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Handling data parameter: test
  2. Handling data parameter: test
  3. dddd
  4. !Caught SIGHUP, updating parameters..
  5. Handling data parameter: dddd
  6.  
  7. Handling data parameter: dddd
  8.  
  9. ^C
  10.  

- только тогда скрипт будет "висеть" и ждать ввода и не продолжит свою работу до тех пор, пока не будет сделан ввод.
Схема - послать SIGHUP - сделать ввод (я делал в той же консоли, как видно из лога) - получить обновление параметра.


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



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


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


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




EuGen пишет:
^C
SIGTERM detected! Радость
 
 Top
Champion Супермодератор
Отправлено: 07 Ноября, 2011 - 20:23:43
Post Id



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


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


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




Интересный механизьм придумали. Я вдруг осознал, что на форме нет функционала Избранное! По-моему, он нужен
 
 Top
EuGen Администратор
Отправлено: 07 Ноября, 2011 - 22:22:06
Post Id


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


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


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




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


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



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


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


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




EuGen если уж дело пошло, то так тоже работает:
PHP:
скопировать код в буфер обмена
  1. while (true) {
  2.   usleep(100000);
  3.   $com = fgets(STDIN);
  4.   if (trim($com) != "") echo "Your command: $com\n";
  5.   }

т.е. pcntl_signal не нужен, и лишние телодвижения тоже..
EuGen пишет:
где это реально нужно.
Есть подключение по ssh, оно отваливается каждые 20-40 мин, даже если я что-то делаю.
Запускаю всякие парсеры.. Мне надоело следить за состоянием соединения.
Пусть парсеры сами там работают. Просто хотел отписать удобную штуку для управления этими процессами.
Чтобы не лазить по ps -A -F и не грепать каждый раз.
Зашел посмотрел как там дела, запустил/перезапустил/остановил кого надо, вышел...

(Отредактировано автором: 08 Ноября, 2011 - 10:33:29)

 
 Top
EuGen Администратор
Отправлено: 08 Ноября, 2011 - 10:58:42
Post Id


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


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


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




DeepVarvar пишет:
Запускаю всякие парсеры.. Мне надоело следить за состоянием соединения.


man screen


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



Рекордсмен по количеству сообщений за 7 дней


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


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




Просто хотел отписать удобную штуку для управления этими процессами

так и сделайте удобную штуку для управления этими процессами - общего родителя
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 08 Ноября, 2011 - 11:47:32
Post Id



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


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


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




Stierus пишет:
общего родителя
Именно это и делаю. Но pcntl_fork не подойдет. Он же "отражение" стандартного никсового fork().
Процессы разные - мне не нужны копии родителя.
Однако и слежение за "потомками" требуется.
EuGen пишет:
man screen
А смысл? Соединение разрывается, парсер(-ы) падает(-ют) когда теряется окружение из которого он(-и) был(-и) запущены.
Крон? Нет - действия одноразовые. Причина? Чье-то "Хачу щас"...
 
 Top
EuGen Администратор
Отправлено: 08 Ноября, 2011 - 11:54:56
Post Id


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


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


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




DeepVarvar пишет:
А смысл? Соединение разрывается, парсер(-ы) падает(-ют) когда теряется окружение из которого он(-и) был(-и) запущены.

Все-таки видимо Вы не прочитали описания.
0. Установите (если не установлен) пакет screen на целевом сервере
1. В установленной ssh-сессии:

2. Наберите команду (парсер к примеру)
3. Разорвите ssh-сессию
4. Откройте новую сессию, наберите

5. Увидите список скринов. Наберите
CODE (htmlphp):
скопировать код в буфер обмена
  1. screen -r <screen-name>

- проверьте результат.
Да, кстати, screen можно деаттачить комбинацией Ctrl+A и после этого D


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



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


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


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




EuGen пишет:
Установите (если не установлен) пакет screen на целевом сервере
У меня нет рута, а screen не установлен.
 
 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