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: