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
Форумы портала PHP.SU :: Версия для печати :: shell/bash - как?
Форумы портала PHP.SU » Серверное администрирование » Администрирование *nix » shell/bash - как?

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

1. DeepVarvar - 07 Ноября, 2011 - 15:39:00 - перейти к сообщению
Как передать аргумент уже работающему php-процессу?
На старте да, так:
Спойлер (Отобразить)

PID известен.
Не зомби и не демон, просто долго выполняется.
2. dzubchik - 07 Ноября, 2011 - 15:51:31 - перейти к сообщению
а такое возможно?
3. DeepVarvar - 07 Ноября, 2011 - 16:12:08 - перейти к сообщению
Повесить свой обработчик на один из сигналов,
например, SIGSTOP не катит - он не может нести информацию,
он сам есть информация.
(Добавление)
Может как-то можно через stdin по PID'у?
4. EuGen - 07 Ноября, 2011 - 16:20:29 - перейти к сообщению
Через сигналы никак (сигнал несет в себе только целое число - собственно свой код)
Если скрипт сам не понимает (заранее), то уже не передать.
Однако можно сделать что-то наподобие вот такого костыля:
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

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

- естественно, в файл данные были записаны до отсылки сигнала.
5. DeepVarvar - 07 Ноября, 2011 - 16:26:20 - перейти к сообщению
EuGen Закатив глазки я только ушел от файлов... Но не важно. Это мысль.. Разбирать буду уже завтра - рабочий день кончился уже как 25 мин назад..
Отпишу как получилось. Закатив глазки
(Добавление)
Писать буду не в файл, а в память, там хоть залочить можно по человечески..
Можно кстати и через lock сегмента попробовать.
Смысл тот же - действие на событие.
(Добавление)
Плюсанул Закатив глазки
6. EuGen - 07 Ноября, 2011 - 16:37:58 - перейти к сообщению
Можно хитрее:
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 - сделать ввод (я делал в той же консоли, как видно из лога) - получить обновление параметра.
7. DeepVarvar - 07 Ноября, 2011 - 18:41:06 - перейти к сообщению
EuGen пишет:
^C
SIGTERM detected! Радость
8. Champion - 07 Ноября, 2011 - 20:23:43 - перейти к сообщению
Интересный механизьм придумали. Я вдруг осознал, что на форме нет функционала Избранное! По-моему, он нужен
9. EuGen - 07 Ноября, 2011 - 22:22:06 - перейти к сообщению
Что же здесь хорошего? Это же костыль, костыль.. необходимость изменения параметров запуска - это архитектурный просчет, нет и не придумать таких конструкций, где это реально нужно.
10. DeepVarvar - 08 Ноября, 2011 - 10:33:05 - перейти к сообщению
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 и не грепать каждый раз.
Зашел посмотрел как там дела, запустил/перезапустил/остановил кого надо, вышел...
11. EuGen - 08 Ноября, 2011 - 10:58:42 - перейти к сообщению
DeepVarvar пишет:
Запускаю всякие парсеры.. Мне надоело следить за состоянием соединения.


man screen
12. Stierus - 08 Ноября, 2011 - 11:00:39 - перейти к сообщению
Просто хотел отписать удобную штуку для управления этими процессами

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

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

2. Наберите команду (парсер к примеру)
3. Разорвите ssh-сессию
4. Откройте новую сессию, наберите
CODE (htmlphp):
скопировать код в буфер обмена
  1. screen -ls

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

- проверьте результат.
Да, кстати, screen можно деаттачить комбинацией Ctrl+A и после этого D
15. DeepVarvar - 08 Ноября, 2011 - 12:03:10 - перейти к сообщению
EuGen пишет:
Установите (если не установлен) пакет screen на целевом сервере
У меня нет рута, а screen не установлен.

 

Powered by ExBB FM 1.0 RC1