Ручные
цирковые
демоны
Андрей ВОРОБЕЦ
Вам никогда не хотелось иметь ручного демона? Это шутка, конечно, но написать своего демона для
unix-like ОС и научить его исполнять те трюки, которые вам нужны — по-моему, занятие не бесполезное
©.
Писать своего демона мы будем на языке программирования Python.
П
ля написания демона под Linux понадобятся модули sys,
o s ,
tim e
и
s ig n a l,
которые входят в стандартную поставку. Ба-
зовые
понятия
про
Python
можно
почерпнуть
на
http://www.python.ru/docs. Итак, если вы немного ориентируетесь
в языке, создаем файл
daem on.р у
и пишем:
#! / u s r / b in / e n v p y th o n
#
c o d in g : u t f 8
# П роверка работы в к а ч е с т в е демона
im p o rt s y s , o s , tim e
fro m s ig n a l im p o rt SIGTERM
im p o rt m yvar
В файл myvar .ру для удобства пользования вынесем настройки
демона (располагается этот файл там же, где и наш будущий де-
мон). В большинстве линукс-сисгем по умолчанию каталог /var/tm p
доступен для записи, поэтому используем его. Впрочем, никто не
мешает вам использовать /tmp или домашний каталог. Поэтому
создаем этот файл и пишем туда следующее:
#! / u s r / b in / e n v p y th o n
#
c o d in g : u t f 8
# m y v a r.р у
# Файл долж ен сущ е ств о в ать и бы ть д оступны м д л я за п и си ! ! !
daem o n _ lo g = "/var/tm p /m yd aem o n . lo g "
# P id файл — е сл и демон уп а л и е г о н адо за п у с т и т ь — у д а л и ть
файл !
d a e m o n _ p id = "/va r/tm p /m yd a e m o n .p id "
# М е сто , о т к у д а з а п у с к а е т с я демон
d a e m o n _ p la c e = "/v a r/tm p /"
# В р ем я, н а к о то р о е дем он засы п а е т (в с е к у н д а х ):
daem on_sleep= 240
Продолжаем писать нашего демона (переходим обратно к ре-
дактированию файла
daem on.ру).
Проверяем, запущен ли наш де-
мон напрямую, и если да, то запускаемся:
i f (__name__ == "
m ain ___" ) :
s t a r t s t o p (s td o u t = m yva r .daem on lo g , p i d f i l e = m yva r.
daem on_pid)
t e s t О
В только что написанных трех строчках вызываются две фун-
кции —
s t a r t s t o p
и
t e s t .
Их у нас пока нет, но мы их рассмот-
рим.
t e s t
— это рабочая функция демона. То есть именно здесь мы
будем писать все те действия, которые наш демон должен выпол-
нять. Но поскольку наш демон в общем-то ничего выполнять не дол-
жен, то он будет через определенное нами в конфигурационном
файле (еще помните файлик —
m y v a r.ру,
который мы только что
создавали?) время просыпаться и записывать текущее время и ко-
личествово пробуждений в файл:
d e f t e s t ():
s y s . s td o u t . w r it e ( 'M e ssa g e t o s t d o u t .
. . ' )
s y s . s t d e r r . w r it e ( 'M e ssa g e t o s t d e r r .
. . ' )
с = 0
w h ile 1:
s y s . s t d o u t . w r it e ('% d: % s\n '
%
( c , tim e c t im e ( tim e .
t im e t ) ) ) )
s y s . s t d o u t . f l u s h ()
c = c + 1
t im e . s le e p ( m y v a r. daem on^ sleep)
Функцию записываем сверху (до) записанных раннее строчек.
Теперь посмотрим на нашу вторую функцию —
s t a r t s t o p .
Она
используется для анализа параметров командной строки, опреде-
ления текущего состояния демона (запущен/не запущен) и вызова
основной функции по созданию демона. Сначала проверяется дли-
на переданного скрипту аргумента.
•S Если она больше
1
— демон пытается открыть
p id
файл (файл,
в котром записан номер процесса). Если файла нет, то генериру-
ется исключение и переменной
p id
присваивается значение
None.
■S Если демону передан аргумент
s to p
или
r e s t a r t ,
то в случае
отсутствия
p id
файла демон уведомляет об этом, и осуществляется
выход из функции. Если же все нормально, то пытаемся закрыть про-
цесс, указанный в
p id
файле, и устанавливаем время исполнения
данной операции в 1
секунду. Если же возникает системная ошиб-
ка, то в случае, если она вызвана отсутствием процесса, демон уда-
ляет
p id
файл и полностью останавливается. Если же какая-либо
другая ошибка, он пишет эту ошибку в лог-файл.
S Если демону передан аргумент
s t a r t ,
то демон вначале про-
веряет, существует ли pid. Если да, то демон говорит, что процесс
уже существует, и выходит. Иначе запускается непосредственно
функция демонизирования ©.
И Если же демон запущен без параметров, то выводятся пара-
метры для запуска и демон выходит из себя ©.
d e f s t a r t s t o p (s td o u t= ' / d e v / n u ll' , s td e rr= N o n e , s t d in = ’
/ d e v / n u ll ', p id f ile = ' p i d . t x t ' , s ta rtm s g = 's t a r t e d w it h
p id % s ' ):
i f le n ( s y s . a r g v ) > 1 :
a c t io n = s y s . a r g v [ l]
t r y :
p f = o p e n ( p id f ile )
p id = i n t ( p f . re a d ( ) . s t r i p ())
p f . c l o s e ()
e x c e p t I O E r r o r :
p id = None
i f ( ( a c t io n == 's t o p ') o r ( a c t io n == 'r e s t a r t ') ) :
i f (n o t p i d ) :
m ess = "He м о гу о с та н о в и ть , p id файл '% s' о т с у т с т в у е т . \n "
s y s . s t d e r r .w rite ( m e s s
%
p i d f i l e )
s y s . e x it (1)
t r y :
w h ile 1:
o s .k i l l ( p i d , SIGTERM)
t im e . s le e p (1)
e x c e p t O S E rr o r, e r r :
e r r = s t r ( e r r )
i f e r r . f in d ("N o s u c h p r o c e s s " ) > 0:
o s . r e m o v e ( p id file )
i f 's t o p ' == a c t io n :
s y s . e x i t (0)
a c t i o n = 's t a r t '
p id = None
e ls e :
p r in t s t r ( e r r )
s y s . e x i t (1)
i f ( ' s t a r t ' == a c t io n ) :
i f ( p id ) :
m ess = "С т а р т о тм ен ен — p id файл '% s' су щ е ств у е т. \n "
s y s .s t d e r r .w r it e ( m e s s %p i d f i l e )
s y s . e x it (1)
# За п уска е м п р о ц е сс дем онизации ск р и п та :
d e a m o n ize (s t d o u t , s t d e r r , s t d in , p id f ile , s t a r t m s g )
r e t u r n
p r in t "Синтаксис запуска:
s t a r t I sto p I r e s t a r t "
%
s y s .a rg v [0]
s y s . e x it (2)
В самом конце кода используется еще одна функция —
deam o-
n iz e .
Что же она делает? А она, собственно, и создает нашего де-
мона.
№ 8/335 21 февраля-28 февраля 2005
предыдущая страница 40 Мой Компьютер 2005 08 читать онлайн следующая страница 42 Мой Компьютер 2005 08 читать онлайн Домой Выключить/включить текст