PermLUG |
Пермская группа пользователей Linux |
|
|
|
||
ОблакоВход в системуОпросКаким вы бы хотели видеть символ ПермЛАГа?
Жираф
29%
Жираф + tux
9%
only TUX
37%
другое...
26%
Всего голосов: 35
|
Демонизация по-быстрому или сага о правильном велосипеде.
CORPSE, 13.03.2010 — 01:59
Что такое демон, человеку, знакомому с UNIX средой, думаю объяснять не нужно. Сегодня я расскажу, как быстро и просто запускать процессы в SysV-style системе в качестве демонов с pid, lock файлами и т.п., в общем, по-феншую. Думаю, новичкам пригодится. А может быть и не только новичкам. Всё ниже описанное было реализовано и проверено на моём домашнем сервере, работающем под Debian Lenny 5.0.3. Итак, я против изобретения велосипеда, если этот самый велосипед имеется в наличии, не требует Подбираем тут: Буквально из одной строки мана сразу становится понятно, как использовать утилитку. В качестве опций задаются все необходимые пути/имена.
SYNOPSIS
daemonize [-a] [-c directory] [-e stderr] [-o stdout] [-p pidfile] [-l lockfile] [-u user] [-v] path [arg] ...
Специально для танкистов ниже в мане подробно описано значение каждого параметра. То, что неочевидно, приведу ниже, дабы облегчить Вам жизнь: -a Append to the output files, rather than overwriting them (which is the default). Only applicable if -e and/or -o are specified. Иными словами, при использовании с ключом -a вместо перезаписи лог файлов будет происходить дописывание в уже существующие. -v Cause daemonize to write verbose messages to standard error, telling what it’s doing as it daemonizes the program. Обычный "вербоуз" - чуть больше информации в еррорлоге о работе программы. path - это полный путь к запускаемой программе. Например, если я хочу запустить своего джаббер бота, я должен в качестве path указать /opt/bot/bot, а не просто bot, даже если я использовал параметр -c /opt/bot. arg - в данном случае - аргументы запускаемой программы. Рекомендации по сборке велосипеда поражают своей подробностью, дотошностью и вниманием к деталям: INSTALLATION Normal installation: $ sh configure $ make $ su # make install For a detailed report of the available "configure" options: $ sh configure --help Что радует, вышеописанного вполне достаточно. На упомянутой lenny 5.0.3 велосипед самособрался в мгновение ока, я даже не успел сказать "вотнифигасебебрайанклаппермолодецкакой"! Чего и Вам желаю. Итак, с устройством велосипеда разобрались, теперь учимся на нём ездить. :) Что необходимо для феншуистой SysV системы? Правильно! Скрипт запуска/остановки в /etc/init.d/ и соответствующие симлинки в rc*.d. Не буду особо мучать вас теорией, а лучше сразу перейду к практике. Все, кто ещё не знают принципов, по которым должен работать скрипт из /etc/init.d/, могут пообщаться с гуглом на предмет "SysV-style". Рассмотрим создание подобного файла на примере моей задачи. Это всего лишь пример, который я набросал на коленке. Он всем меня устраивает и даже (о, чудо!) работает. Бот состоит из двух частей. :)
#!/bin/bash
# Переменная содержит путь к рабочей директории процесса
BPATH="/opt/bot"
# А здесь хранится путь к некоей директории var, в которой будут содержаться наши логи, пид и лок файлы
VP="/opt/bot/var"
# Имя пользователя, от которого должны запускаться процессы. Помни! Сильно кастрированный в правах пользователь - залог твоей безопасности!
USER="bot"
# Функция проверяет, запущен ли процесс с именем, переданным параметром. Если запущен, возвращает 0, в противном случае 1. Не логично? Конечно! Мы же используем stderr!
# Usage: chk
function chk() {
if [ -f "$VP/$1.pid" ]; then # Смотрим, существует ли пид файл
TPID="$( ps -A | grep "^ *$( cat $VP/$1.pid) " )" # Если существует, проверяем, запущен ли процесс с пидом, хранящемся в этом файле
fi
if [ -n "$TPID" ]; then # Если в этой переменной что-то есть, т.е. процесс запущен, то возвращаем 0
return 0
else # А если не запущен, то 1.
return 1
fi
}
# Функция для запуска. 1-й параметр - имя процесса, второй - его описание для красоты в stdout :)
# Usage: fstop [long name]
function fstart() {
if [ -z "$2" ]; then # Если описания нет, то берём в качестве описания имя процесса
LNAME="$1"
else
LNAME="$2"
fi
if [ -n "$1" ]; then # Нам нужен хотя бы один параметр - имя процесса
SNAME="$1"
echo "Starting $LNAME module..."
if chk $SNAME; then # Если процесс уже запущен, грязно ругаемся на пользователя
echo Another $LNAME process is already running...
else # Если нет, то запускаем по-феншую, как и обещали
/usr/local/sbin/daemonize -c "$BPATH" -e "$VP/err_$SNAME.log" -o "$VP/$SNAME.log" -p "$VP/$SNAME.pid" -l "$VP/$SNAME.lock" -u "$USER" -v "$BPATH"/$SNAME
if chk $SNAME; then # Проверяем снова. Процесс таки запустился?
echo $LNAME started successfully... # Всё хорошо, юзер, спи спокойно. :)
else
echo $LNAME start failed! See $VP/err_$SNAME.log for more information. # Шеф, всё пропало! Надо послать юзера
Таким образом, мы при помощи одного скрипта можем ездить сразу на двух велосипедах, а можем и на трёх и на четырёх и т.п.. На мой взгляд, получилось довольно удобно. Только если запуск программы требует кучи параметров, то для использования с данным скриптом лучше создать ещё один небольшой однострочный вспомогательный скриптик, который будет включать в себя строку запуска процесса со всеми необходимыми параметрами. Возможно также вам захочется запускать из одного срипта различные процессы от имени различных пользователей, тогда необходимо будет допилить функцию fstart, чтобы передавать туда имя пользователя ещё одним параметром. На данный момент синтаксис вызова всех функций сделан одинаковым для всеобщего вселенского блага. А можно например ещё сделать force-reload через kill -9, если вам это принесёт счастье. У меня просто сегодня не дошли до этого руки. Скрипт писался минут 20-30, а статья 2-3 часа. Но чего только не сделаешь, когда Осталось только поместить полученный скрипт в /etc/init.d и наделать кучу нужных симлинков. Но это совсем просто, поэтому я подло оставляю Вас с этим один на один и вероломно иду спать, ибо за бортом -3 и половина третьего ночи, а за спиной рабочая неделя. До новых встреч! *Мну открыл пасть, засунул в неё лапу и упал в спячку* Хрррррр.... Хррррр..... Хрррррр.... |
Новые записи в блогахАктивные обсуждения форумаНовости Linux
|
| Пермская группа пользователей Linux, 2003—2010 | ||
Вдогонку из берлоги...