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

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; 
    } 
}
 
Написал сервер, запускаю как демон из консоли в Cent OS 5.0 из под рута.
это не демон, а рядовой скрипт
Пока я не закрыл SSH сессию сервер нормально пашет, но как только я отключаюсь клиент до него не может достучаться
так как это рядовой скрипт, то он и закрывается с закрытием консоли
Подсоединяюсь, смотрю ps aux - моего сервера нет в процессах.
и не будет, так как с закрытием той консоли, в которой он был запущен он был закрыт системой.
Подскажите, что я делаю не так
выхода два:
- написать скроипт как демон, а для этого надо немного погуглить на тему demonize()
- не мучаться и использовать screen
 
Тогда объясните пож. чем этот скрипт отличается от демона и как привести его к нужному виду?
Во всех схожих темах, где речь идет о демонах все сделано именно так (например: http://ru2.php.net/socket_accept ). Если я ошибаюсь то поправьте меня ведь я именно за этим сюда пришел.
 
Принцип демонизации:
демоны должны быть отсоединенными от терминала, по этому:
все stdin/out/err > /dev/null
демоны не должен иметь родительского процесса, для этого
- форкнуть процесс
- в дочернем процессе установить setsid(0)
- закрыть все открытые дискрипторы, лучше от 0-1024
- сделать dup() дескрипторов 1,2,3 и перенаправить в /dev/null
- форкнуть второй раз

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

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

-~{}~ 13.11.09 13:53:

ilyichzc можно поискать код демонизации, даже на форуме это обсуждалось.
 
Alexandre
Не совсем так. Демоны ядра, конечно, имеют ppid=0, но все userspace демоны имеют парента init, т.е. ppid=1
 
Спасибо за подсказки. Запуститься удалось. Причиной как я понимаю было то, что программа писала сообщения в консоль.
 
причиной было то, что программа была запущена в окружение консоли, при закрытии консоли, закрывалась и программа...
 
Автор оригинала: Alexandre
причиной было то, что программа была запущена в окружение консоли, при закрытии консоли, закрывалась и программа...
Ну а почему же она тогда сейчас работает?
 
Ну а почему же она тогда сейчас работает?
я не знаю? что ты там сделал, но судя по данным советам, если ты им следовал, ты должен был ее "демонизировать", т.е. отсоединить от окружения консоли
 
За советы спасибо. Буду экспереметнировать. Просто я расчитывал, что глядя на мой код кто-то сможет назвать точную причину. Ведь если Вы видите в нем ту ошибку, которая мешает, то можете ее назвать. А получается, что приходится ставить эксперементы. Я взял за основу класс по ссылке http://www.phpclasses.org/browse/file/8958.html , которую мне посоветовали. Но программа все так же отрубалась при разрыве сессии. Тогда я отключил вывод лога в стандартный поток и все заработало.
 
Сверху