Страница 1 из 1
Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 16:50:13
CaBa
Прилепил транспорт на openfire и подумалось, что хорошо бы было запускать через rc.conf. Написал скрипт. Вроде всё взлетает, но есть грабли - не получается остановить командой stop пишет: jabber_mrim not running? (check /var/run/mrim.pid).
Код: Выделить всё
#!/bin/sh
#
#
# PROVIDE: jabber_mrim
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
./etc/rc.subr
name="jabber_mrim"
rcvar=`set_rcvar`
load_rc_config $name
: ${jabber_mrim_enable="NO"}
: ${jabber_mrim_dir="/usr/local/etc/openfire/mrim/src"}
: ${jabber_mrim_piddir="/var/run"}
: ${jabber_mrim_confdir="/usr/local/etc/openfire/mrim"}
pidfile="${jabber_mrim_piddir}/mrim.pid"
conffile="${jabber_mrim_confdir}/mrim.conf"
command="${jabber_mrim_dir}/mrim.py"
command_args="-d -c ${conffile} -p ${pidfile}"
run_rc_command "$1"
Может подскажете куда рыть?
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 16:59:28
paradox
ну а кто пидфайл будет создавать по вашему?
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 22:07:01
CaBa
Да в том то и дело, что pid-файл создаётся и в файле правильный PID процесса. Но вот проблема - не останавливает и всё.
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 22:14:15
paradox
я вообще там невижу не команду запуска ни команду остановки
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 22:28:15
CaBa
Сорри конечно за такие вещи - просто сильно новичок в системе. Пытался построить скрипт на основе аналогичного от pyicq-t.

Правильно ли использовать в данной ситуации такой код:
Код: Выделить всё
start_cmd="${name}_start"
stop_cmd=":"
${name}_start()
{
}
Только вот не совсем понятно, что писать в данном случае в стартовой части. По факту должен запускаться питонский файл с флагами -d -p пидфайл -c конфигфайл.
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 22:33:10
paradox
возьмите по примеру любой из /etc/rc.d/
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:14:00
CaBa
Сделал через:
теперь терзает одно сомнение, а правильно ли это, может есть более правильные методы?
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:16:13
paradox
а кто мешает сделать нормально?
ведь у того сервера есть свой скрипт запуска?
так почему его не разобрать?
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:27:52
CaBa
скрипт запуска (родной) у него был простой как велосипед:
а разбирать питоновский файл на вопрос поиска функции остановки, что-то пока квалификации не хватает.

Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:36:04
paradox
так кто мешал питон скрипт от сюда туда заюзать на старт и стоп
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:39:17
CaBa
не могу разобраться... как его корректно останавливать?
mrim.py:
Код: Выделить всё
#!/usr/local/bin/python2.5
import config
import sys
import getopt
import signal
import os
import hotshot, hotshot.stats
#usage = '''Usage:
#-d detach from console
#-c file path to config file
#-s file analyse the profiling file
#-p file path to pid file'''
daemon = False
config_file = None
pid = None
try:
opts, args = getopt.getopt(sys.argv[1:], "hdc:ps:")
except getopt.GetoptError, e:
print "Can't start:", e.msg
print usage
sys.exit(1)
for k,v in opts:
if k == '-h':
print usage
sys.exit(0)
elif k == '-s':
s = hotshot.stats.load(v)
s.strip_dirs()
s.sort_stats('time', 'calls')
s.print_stats(20)
sys.exit(0)
elif k == '-d':
daemon = True
elif k == '-c':
config_file = v
elif k == '-p':
pid = v
if not config_file:
print usage
sys.exit(1)
conf = config.Config(config_file)
conf.daemon = daemon
if pid:
conf.pidfile = pid
if __name__ == "__main__":
import init
if conf.profiling:
pfile = os.path.join(conf.profile_dir, "mrim.prof")
p = hotshot.Profile(pfile)
p.runcall(init.start)
p.close()
else:
init.start()
тут есть только одно предположение, что ему нужно дать sys.exit(1). только куда и как что-то не представляю даже.
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:42:41
paradox
ты не понял
я говорил
почему бы команду
не вставить на старт и стоп
а там уже пусть сам питон работает
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:49:47
CaBa
не фунциклирует на старт и стоп. он при стопе в таком случае, ещё один процесс запускает.
и нарисовывается ещё один процесс.
видимо просто скрипт не подразумевает корректную остановку. или я что-то не вкуриваю всё-таки

Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-10 23:54:31
paradox
конечно не вкурил
там в скрипт нужно передавать параметр $*
который должна быть комманда
а у тебя в обоих случаях получаеться пустое место
и он отрабатывает его по умолчанию
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-11 0:11:55
Гость
даа. что такое дерево, почему оно не тонет, и почему оно - я...
если ему в стоп запихнуть явное выражение при котором он делает sys.exit(1), он всего навсего не стартует новый процесс, а вот старый он видимо прибивать не умеет..
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-11 0:23:06
CaBa
странный листинг для лини, что-то совсем непонятно, как он тут должен останавливаться.
Код: Выделить всё
#!/bin/sh
#
# mrim This shell script takes care of starting and stopping
# jabber-mrim standalone Jabber component.
#
# chkconfig: 2345 71 29
# description: Mail.ru transport for Jabberd2 \
#
# processname: mrim
# config: /etc/jabberd2/mrim.conf
# pidfile: /var/run/mrim/mrim.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
MRIM_CONF=/etc/jabber-mrim/mrim.conf
LOCKFILE=/var/lock/subsys/jabber-mrim
PIDFILE=/var/run/jabber-mrim/mrim.pid
MRIM_USER=_jabber_mrim
MRIM_DIR=/usr/share/jabber-mrim
MRIM_EXEC="/usr/share/jabber-mrim/src/mrim.py"
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 0
RETVAL=0
start()
{
start_daemon \
--pidfile "$PIDFILE" \
--lockfile "$LOCKFILE" \
--user "$MRIM_USER" \
--name python \
--displayname jabber-mrim \
-- "$MRIM_EXEC" -d -c "$MRIM_CONF" -p "$PIDFILE"
RETVAL=$?
}
stop()
{
stop_daemon \
--pidfile "$PIDFILE" \
--lockfile "$LOCKFILE" \
--expect-user "$MRIM_USER" \
--displayname jabber-mrim \
-- python
RETVAL=$?
}
stat()
{
status \
--pidfile "$PIDFILE" \
--lockfile "$LOCKFILE" \
--expect-user "$MRIM_USER" \
--displayname jabber-mrim \
-- python
RETVAL=$?
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
stat
;;
*)
msg_usage "${0##*/} {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-14 20:54:06
Alex Keda
Гость писал(а):даа. что такое дерево, почему оно не тонет, и почему оно - я...

жжёшь!

Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-14 21:11:55
CaBa

зато правда. тут на самом деле чувствуешь себя дубом. трудновато начинать... но что поделать
P.S. По скрипту в конфе по mrim подсказали делать Kill -INT.

Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-14 21:22:42
Гость
Гость писал(а):две функции
две
shell-функции
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-14 21:34:25
CaBa
так собственно и было описано выше: stop_cmd="kill `cat /var/run/mrim.pid`"
в других транспортах есть проблемы - если их убивать через kill - то не сохраняются последние данные из сессии, например регистрации в транспорте и тд и тп.
тут пока тьфу-тьфу таких проблем нету, вроде все настройки у него живут в xml-файлах.
в общем ХЗ - будем смотреть!.
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-15 1:45:40
Гость
CaBa писал(а):в других транспортах есть проблемы - если их убивать через kill - то не сохраняются последние данные из сессии, например регистрации в транспорте и тд и тп.
хм, типа такого?
Код: Выделить всё
except KeyboardInterrupt:
logger.critical('Got SIGINT, closing connections')
xmpp_con.stop()
logger.critical('Shutdown')
sys.exit(0)
так что можно попробовать привязать это действие к SIGTERM (сигнал, кой kill(1) посылает по умолчанию) добавив в mrim.py
Код: Выделить всё
@@ -35,6 +35,10 @@
conf = config.Config(config_file)
conf.daemon = daemon
+def quit(signum, frame):
+ raise KeyboardInterrupt
+
if __name__ == "__main__":
import init
+ signal.signal(signal.SIGTERM, quit)
init.start()
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-15 8:24:15
CaBa
Доцент, он не ложится.©
Зато посмотрел в логах - отлично реагирует на команду Kill -INT, в логах видно:
15/06/09-09:16:16 Got SIGINT, closing connections
15/06/09-09:16:16 [ххххххх@mail.ru] Connection closed by ourselves
15/06/09-09:16:16 Shutdown
в итоге: просто в rc.d для mrim запихну stop_cmd="Kill -INT `cat /var/run/mrim.pid`"
В итоге, как говорил мой шеф: Нужно наградить непричастных и наказать невиновных.
Всем спасибо, кто помогал!
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-15 8:32:38
thefree
ну вот теперь есть повод нарисовать порт (:
Re: Проблемы с rc.d-скриптом
Добавлено: 2009-06-15 8:50:15
CaBa
Нужно ли оно кому-то или нет, вот в чём вопрос.
Нужно хандбук по ентому поводу изучить. И можно попробовать с портом.