Как передать "демону" команды не используя сокеты?

fast2111

Новичок
Как передать "демону" команды не используя сокеты?

Задача в следующем. Есть демон который слушает сокет (общается с сервером, тип сокета AF_UNIX).
Демон звено AJAX. Как остановить демон не используя сокеты и сигналы?
Я пробовал использовать
PHP:
$_SESSION
. Т. е. он запускается по AJAX запросу и ждет определенного ответа, но его необходимо прервать
да так что бы он правильно закрыл все сокеты и не "испортил" их.
Меняется ли
PHP:
$_SESSION
в рантайме, т.е. я его в рамках одной сессии меняю в нажде что демон увидит эти изменения.
Сокеты и сигналы не подходят. Как можно это сделать?
Заранее благодарен.
 

MiksIr

miksir@home:~$
Сессия подгружается при старте скрипта и выгружается при помирании скрипта.
А в чем проблемы с сокетами и сигналами? И ваще, мож виновата трещащая голова, но нефига не понял, кто запускается, по какому запросу и зачем его килять.
 

fast2111

Новичок
Все всем спасибо. Shared Memory Functions решение этой задачи. А сигналы и сокеты не подходят. Сигналы как я счетаю нужны только в экстренных случиях и применять их не стоит как управляющие команды для демона, а сокетов там и так уже куча да и слишком громоздко для решаемой задачи.
Еще раз всем спасибо.
 

Alexandre

PHPПенсионер
Сигналы как я счетаю нужны только в экстренных случиях и применять их не стоит как управляющие команды для демона
Взаимодействие процессов в Апече происходит используя сигналы... Неуж-то разработчики апача посчитали его экстренным случаем? :D
 

fast2111

Новичок
Автор оригинала: Alexandre
Взаимодействие процессов в Апече происходит используя сигналы... Неуж-то разработчики апача посчитали его экстренным случаем? :D
Разработчики молодцы! Но это мое сугубо личное мнение насет сигналов.:)
 

romy4

invoke [brain]
как крон демон. пусть следит за изминением какого-то файлика.
 

fast2111

Новичок
Я снова про совего демона. С shared memory все прекрасно работает, но это влечет за собой очистку памяти что проблемотично, так как shm_key для доступа к памяти нужно хранить между сессиями, а это либо файл либо БД, вообщем много дейсвий, а хотелось бы обойтись сессиями. И это возможно если использовать следующий способ:
PHP:
$run = 1;
while ($run) {
    ...
    session_start();
    if ($_SESSION["stop"] == 1) {
         $run = 0;
    }
    ...
}
Как вы счетаете это правильно? Постаянно на каждом шаге инициализировать сессию хорошо или плохо?
Спасибо.
 

MiksIr

miksir@home:~$
Сессии, это тоже файл.

ЗЫ: если у Вас в задачи сигналов входит только один сигнал "остановка", используйте системные сигналы - они именно для этого и предназначены - говорить процессу, что ему пора остановиться.
 

fast2111

Новичок
Автор оригинала: MiksIr
Сессии, это тоже файл.
Проблема в том, что я хочу использовать простые стандартные средства. Тем более это все дело под управлением Apache + mod_php, а расширение pcntl для отправки сигналов только в CLI/CGI, но не в модуле для Apache. То есть надо будет изголяться, использовать
PHP:
system("kill ... ")
да хранить daemon.pid для отправки несчастного SIGUSR1, а сессии просто сказка, к тому же жизнь "демона" в этой задаче не вечна, а неболше двух минут(но его могут прервать в любой момент его жизни).
Если можете разубедите меня.
 

Alexandre

PHPПенсионер
Проблема в том, что я хочу использовать простые стандартные средства. Тем более это все дело под управлением Apache + mod_php, а расширение pcntl для отправки сигналов только в CLI/CGI, но не в модуле для Apache. То есть надо будет изголяться, использовать
и
Есть демон который слушает сокет
неможет быть совместимо. Демон по определению не может быть под Апачем. Если демон пишется под пхп - то это только возможно при запуске - консольного приложения в бэдграунде (да и то - это псевдодемон, демон - это программа - отсоединенная от терминала) или при запуске инициализации (рестарта) системы...
Либо я либо кто-то что-то недогоняем...
- ты можешь убить процесс, но для этого ты должен узнать pid демона. А при запуске скрипта пхп - все процессы будут либо php (если это консольное приложение или FASTCGI) либо httpd - если это запускаемо из по апача (опускаем иные WEB-сервера ибо их множество ... он будет запущен под именем этого сервера).
 

MiksIr

miksir@home:~$
Можно научить общаться через сессии. Имхо, нужно просто делать постоянно открытие и закрытие сессии (см. доку). И желательно научить сессии в таком случае использовать шаред память, а то будет постоянное дергание файла.
 

Alexandre

PHPПенсионер
а в пхп ведь можно отвязаться от терминала.?
при желании можно все...

можно написать программу-обертку которая запускает пхп со скриптом и отвязывает их от терминала.
 

fast2111

Новичок
MiksIr
Имхо, нужно просто делать постоянно открытие и закрытие сессии (см. доку). И желательно научить сессии в таком случае использовать шаред память, а то будет постоянное дергание файла.
Вообще сказака. Спасибо, без твоей помощи я очень бы долго к этому шел. Это то что надо. Для ленивых как я.
Alexandre
Демон по определению не может быть под Апачем
Признаю свою ошибку. С горяча это я, но меня всетаки поняли и решение дали.
Спасибо.
 

berkut

Новичок
Alexandre фигня какаято. Пример из книги Джордж Шлосенгейл: проф. програм. на пхп:
PHP:
if (pcntl_fork()) { 
    exit;
}
pcntl_setsid();
if (pcntl_fork()) {
    exit;
}
// здесь полностью демонизированны
гугл//pcntl_setsid выведет на пример из этой книги. Только в мануале pcntl_setsid() - не наблюдается. Может кто проверить, есть такая функция или нет

-~{}~ 27.09.07 15:17:

а чёрт, наверное posix_setsid()

-~{}~ 27.09.07 15:20:

точно, опечатка. далее в примере используется posix_setsid(). так-что можно на пхп отвязаться от консоли!
 

algo

To the stars!
Есть функции межпроцессного взаимодействия SYSV, которые оперируют очередями сообщений.

Может, это то что надо ?
 

Alexandre

PHPПенсионер
фигня какаято. Пример из книги Джордж Шлосенгейл: проф. програм. на пхп:
if (pcntl_fork()) {
exit;
}
pcntl_setsid();
if (pcntl_fork()) {
exit;
}
Спорить не буду, надо проверить,
Библия юникс гласит - Демон должен иметь идентификатор родительского процесса = 0. Если ppid не 0 - значитьне это не демон.

-~{}~ 28.09.07 00:10:

PHP:
$pid = posix_getpid();
$ppid = posix_getppid();

echo "root: pid $pid  ppid $ppid \n";

if (pcntl_fork()) {
    exit;
}
posix_setsid();
if (pcntl_fork()) {
    exit;
}
$pid = posix_getpid();
$ppid = posix_getppid();
echo "'demonize : pid $pid  ppid $ppid \n";
result:
root: pid 21706 ppid 21629
demonize : pid 21708 ppid 21707


Хотя ps говорит - что демон:
Код:
ps
 PPID   PID     PGID    SID   TTY      TPGID STAT   UID   TIME COMMAND
  1      21708 21690  21690   ?         -1         S        0   0:00 php test3.php

Может, это то что надо ?
использовать сигналы: posix_kill( $pid, SIGUSR1); я не понимаю, почему боязнь такая к сигналам?
на SIGUSR1 посадить обработчик:
PHP:
 switch ($signo) {
         case SIGTERM:
         ...
         case SIGHUP:
         ...
         case SIGUSR1:
             echo "Caught SIGUSR1...\n";
             exit
         default:
             // handle all other signals
     }
 
Сверху