Не удается запустить демон

ilyichzc

Новичок
Не удается запустить демон

Написал сервер, запускаю как демон из консоли в Cent OS 5.0 из под рута. Пока я не закрыл SSH сессию сервер нормально пашет, но как только я отключаюсь клиент до него не может достучаться. Подсоединяюсь, смотрю ps aux - моего сервера нет в процессах.
Подскажите, что я делаю не так. Вот код запускайщей проги:

PHP:
 if (!in_array("pcntl", get_loaded_extensions())) $this->addError("PCNTL is disabled!");
	 
 $pid = pcntl_fork(); 

 if ($pid == -1){ 
	trigger_error ("could not fork child process", E_USER_ERROR); 
}

else if ($pid){ 
	exit(0); 
} 

if (!posix_setsid()){ 
  trigger_error ("could not detach from terminal", E_USER_ERROR); 
} 

 pcntl_signal(SIGTERM, array($this, "sigHandler")); 
 pcntl_signal(SIGHUP,  array($this, "sigHandler")); 
 pcntl_signal(SIGUSR1, array($this, "sigHandler"));
}


	// --- Create server object -----------

 $host = 'myhost.com';
 $port = '12000';
	
	$server = new MyServer($host, $port);
	
	if (!is_object($server))
	{
		echo("FATAL ERROR: Can't create server object!");
		exit(1);
	}
	
	$server->setDisplayErrors(true);
	

	
	// --- Connect to MYSQL server -------------------------------------	

 $sql_host = 'localhost';
 $sql_user = 'mysql_user';
 $sql_password = 'mysql@password';
 $sql_db = 'MyServerDB';

	
	$server->db->connect($sql_host, $sql_user, $sql_password, true);
	$server->db->sqlQuery("CREATE DATABASE IF NOT EXISTS {$sql_db} CHARACTER SET utf8 COLLATE utf8_general_ci", false);
	$server->db->selectDb($sql_db);
	$server->db->sqlQuery("set NAMES utf8", false);
	
	
	// --- Add listener -----------------------
	
	$listener = new GSDefaultListener($server);
	$lid = $server->addListener($listener);
	

	$server->start();


function sigHandler ($signo)
{
	GLOBAL $server;
	 
	switch ($signo)
    { 
		case SIGTERM:
			$server->stop(); 
		break; 

		default: 
			$server->logStr("Catch signal ".$signo); 
		break; 
    } 
}
 

Alexandre

PHPПенсионер
Написал сервер, запускаю как демон из консоли в Cent OS 5.0 из под рута.
это не демон, а рядовой скрипт
Пока я не закрыл SSH сессию сервер нормально пашет, но как только я отключаюсь клиент до него не может достучаться
так как это рядовой скрипт, то он и закрывается с закрытием консоли
Подсоединяюсь, смотрю ps aux - моего сервера нет в процессах.
и не будет, так как с закрытием той консоли, в которой он был запущен он был закрыт системой.
Подскажите, что я делаю не так
выхода два:
- написать скроипт как демон, а для этого надо немного погуглить на тему demonize()
- не мучаться и использовать screen
 

ilyichzc

Новичок
Тогда объясните пож. чем этот скрипт отличается от демона и как привести его к нужному виду?
Во всех схожих темах, где речь идет о демонах все сделано именно так (например: http://ru2.php.net/socket_accept ). Если я ошибаюсь то поправьте меня ведь я именно за этим сюда пришел.
 

Alexandre

PHPПенсионер
Принцип демонизации:
демоны должны быть отсоединенными от терминала, по этому:
все stdin/out/err > /dev/null
демоны не должен иметь родительского процесса, для этого
- форкнуть процесс
- в дочернем процессе установить setsid(0)
- закрыть все открытые дискрипторы, лучше от 0-1024
- сделать dup() дескрипторов 1,2,3 и перенаправить в /dev/null
- форкнуть второй раз

судя по твоему скрипту - второй раз форкать не надо (форканье у тебя уже есть)

используй php-forker для запуска своего скрипта и не парься
правда аргументом можно передать только один параметр
 

Santiago

Новичок
Alexandre
> демоны не должен иметь родительского процесса
Я немного попридираюсь, но parent у них будет init.
Главное, это оторвать процесс от терминала. Ну а остальное - как в учебнике )
 

Alexandre

PHPПенсионер
Я немного попридираюсь, но parent у них будет init.
это почти одно и тоже... ppid=0
у всех процессов должен быть какой-то родитель, иначе они не смогут родятся вообще (беспризорных детей тоже кто-то рожал...).
соответвенно, для системных процессов или демонов ppid должен быть = 0

-~{}~ 13.11.09 13:53:

ilyichzc можно поискать код демонизации, даже на форуме это обсуждалось.
 

Santiago

Новичок
Alexandre
Не совсем так. Демоны ядра, конечно, имеют ppid=0, но все userspace демоны имеют парента init, т.е. ppid=1
 

Alexandre

PHPПенсионер

ilyichzc

Новичок
Спасибо за подсказки. Запуститься удалось. Причиной как я понимаю было то, что программа писала сообщения в консоль.
 

Alexandre

PHPПенсионер
причиной было то, что программа была запущена в окружение консоли, при закрытии консоли, закрывалась и программа...
 

ilyichzc

Новичок
Автор оригинала: Alexandre
причиной было то, что программа была запущена в окружение консоли, при закрытии консоли, закрывалась и программа...
Ну а почему же она тогда сейчас работает?
 

Alexandre

PHPПенсионер
Ну а почему же она тогда сейчас работает?
я не знаю? что ты там сделал, но судя по данным советам, если ты им следовал, ты должен был ее "демонизировать", т.е. отсоединить от окружения консоли
 

ilyichzc

Новичок
За советы спасибо. Буду экспереметнировать. Просто я расчитывал, что глядя на мой код кто-то сможет назвать точную причину. Ведь если Вы видите в нем ту ошибку, которая мешает, то можете ее назвать. А получается, что приходится ставить эксперементы. Я взял за основу класс по ссылке http://www.phpclasses.org/browse/file/8958.html , которую мне посоветовали. Но программа все так же отрубалась при разрыве сессии. Тогда я отключил вывод лога в стандартный поток и все заработало.
 
Сверху