Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Помогите! Не работает exec и system тоже :( |
Автор: lyl8000 4.8.2008, 09:32 | ||
В перле новичок, поэтому не очень понимаю, возможно простые вещи. Итак, есть код:
Вопрос такой. Если не делать fork и отключение от консоли то все работает нормально, как только ставлю форк и отключаюсь от консоли вызовы exec или system перестают работать..... Что делать? Как быть? |
Автор: sir_nuf_nuf 4.8.2008, 09:53 |
Привет! В чем это выражается ? то что после fork() перестает работать exec() - это мистика =) Скорее всего проблема в другом. Что именно происходит не так, может не видно какого-то эффекта ? По пути, если ты хочешь писать демона - глянь на http://search.cpan.org/~muir/Daemon-Generic-0.51/lib/Daemon/Generic.pod удобная штука. |
Автор: korob2001 4.8.2008, 10:07 | ||
Я так понимаю нужны зомби? Может это поможет?
|
Автор: sir_nuf_nuf 4.8.2008, 10:30 | ||||||||||
ээ... подождите, а что вы вообще ожидаете получить ?
Вот в этом месте ваша программа кончается. exec подменяет вашу программу (perl) на pidof. все что написано после exec НЕ выполняется никогда (конечно если только exec не обвалится) pidof ? я так понимаю вы хотите получить pid процесса radiusd? тогда вам надо делать скорее так
а вообще узнавать пид по имени - плохая затея. каждый процесс может узнать свой пид так:
или так
пид дочернего процесса возвращается родителю при вызове fork():
|
Автор: lyl8000 4.8.2008, 12:04 | ||
другими словами я пишу что то вроде программки, которая через определенный интервал времени проверяет заупущен ли радиус. если его pid -1 это значит что он не запущен и его надо запустить. вроде бы все просто.... но... написал подругому:
ситуация следующая - тут все работает, до того момента пока я не выйду из консоли в которой запускал данный процесс. до выхода из консоли (logout) все нормально, процесс висит и перезапускает радиус.... после выхода из консоли - только пишет в файл что пытается перезапустить его но сам радиус не перезапускается.... вот ..... помоему я чего то глобального не понимаю.... подскажите плиз :'( |
Автор: GoDleSS 4.8.2008, 13:12 | ||
Не хватает прав скорее всего. Запущен скрипт из под пользователя такого-то, а этот пользователь в логауте. Скрипт пытается делать вызовы внешних программ уже с другими правами. Может и ошибаюсь, но интуиция подсказывает, что копать в указанном направлении ![]() |
Автор: sir_nuf_nuf 4.8.2008, 13:24 | ||
выводите в лог результат выполнения `ваш скрипт`, а так же переменные $? и $^E вот так:
логи пришлите сюда. вы уверены, что такое происходит именно при закрытии консоли? может сам ваш скрипт останавливается ? |
Автор: lyl8000 4.8.2008, 14:09 | ||||
логи в студию!
это когда я в консоли еще. а вот случай когда я вышел из консоли и зашел снова:
во втором случае радиус так и не перезапустился.. причем фразу "Starting authorize radiusd:" пишет скрипт /etc/init.d/radius.sh . Таким образом получается что скрипт стартует, но радиус не поднимает ( а это, как я понимаю проблема уже из другой оперы.. все скрипты запускаю из под рута.. |
Автор: sir_nuf_nuf 4.8.2008, 14:25 | ||||
А) хм... по пробуй не закрывать файловые дескрипторы, а перенаправлять их в /dev/null
такое ощущение, что радиус что то пытается написать в закрытый дескриптор. Б) подмени сам скрипт radiusd =) на что то простое:
т.е. перемести бинарник и на его место положи скрипт. |
Автор: lyl8000 4.8.2008, 14:54 |
убрал вообще close STDIN; close STDOUT; close STDERR; ничего не поменялось... а радиус стоит на рабочем сервере, там до 200 авторизаций в секунду )) не могу его подменить... надо вощем на кошках потренироваться. ![]() потренируюсь - отпишусь. Спасибо всем за помощь!!!! |