[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Python, perl и все-таки демоны!



создаю демона на питоне (проверку ошибок убрал из кода чтоб не
загромождать) так:


переменные:
db_path - путь куда будет chdir демоном сделан
my_script - путь к скрипту который хотим сделать демоном
id_file - путь к файлу куда будет складываться вывод скрипта
par1, par2 - параметры скрипту (это неважно)


# первый раз форкаемся
pid=os.fork()
if pid==0:
	os.chdir(db_path)
	os.setsid()
	pid=os.fork()

	# второй раз форкаемся
	if pid>0:
		sys.exit(0)
	
	# переназначаем потоки
	si=file('/dev/null', 'r')
	so=file(id_file, 'a+', 0)
	
	os.dup2(si.fileno(), sys.stdin.fileno())
	os.dup2(so.fileno(), sys.stdout.fileno())
	os.dup2(so.fileno(), sys.stderr.fileno())

	# пишем в файл свой pid
	print os.getpid()
	sys.stdout.flush()
	sys.stderr.flush()
	
	# дальше работает скрипт
	os.execv(my_script, (my_script, par1, par2))

ну и вот эта программка прекрасно работает на таких скриптах вроде:

#!/bin/sh
while /bin/true; do
	echo $1 $2 `date` stdout
	echo $1 $2 `date` stderr 1>&2
	sleep 1
done

то есть пофиг куда демон-скрипт пишет он все равно в наш файл попадает

а дальше началась заморока если тестовый скрипт написан на perl, то
почему-то его stderr работает, а его stdout в наш лог не выводится:

#!/usr/bin/perl -w
$login = shift;
$password = shift;
while(1) {
	print "$login $password";
	sleep(1);
}

вот от такого скрипта в наш лог попадают только сообщения отладочные
(stderr), а то что print'ами (stdout) не выводится :(

я в перле не силен, я писал cgi обертку для чужого скрипта и не знаю что
делать:
из ком-строки запущенный перловый скрипт все выводит нормально
а из демона - нет

у меня есть предположения что это как-то связано с буфферизацией
выходных потоков интерпретатором perl или чем-то около этого...
но как поправить/выяснить не знаю

помогите разобраться плз!



Reply to: