AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Вызов скрипта через System.

Unix Way 3 сообщений 08.11.2012 12:57 - 12.09.2014 12:26
#1 08.11.2012 12:57

Вызов скрипта через System.

Доброго времени суток. Такой вопрос:
Система: FreeBSD 8.2, Asterisk 1.8.15.1
Есть демон на Python, вот его часть:
[spoiler]

Код: Выделить всё

 import os import atexit import sys import time import syslog import string import re import socket from signal import SIGTERM class Daemon(): pidfile = "/var/run/gDaemonP.pid" stdin='/dev/null' stdout='/dev/null' m_dHost = '127.0.0.1' m_dPort = '5152' m_gates = {} confFile = '/etc/gDaemonP.conf' def daemonize(self): pid = os.fork() if pid == 0: os.setsid() pid = os.fork() if pid == 0: os.chdir(".") os.umask(0) else: sys.exit(0) else: sys.exit(0) atexit.register(self.delpid) pid = str(os.getpid()) file(self.pidfile,'w+').write("%s\n" % pid) return pid def descriptors(self): sys.stdout.flush() sys.stderr.flush() si = file(self.stdin, 'r') so = file(self.stdout, 'a+') os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) def delpid(self): os.remove(self.pidfile) def start(self,interactive=False): if interactive: print "Starting program in interactive mode\n" self.run() return try: pf = file(self.pidfile,'r') pid = int(pf.read().strip()) pf.close() except IOError: pid = None if pid: message = "Daemon already running? (pid=%s)\n" syslog.syslog(syslog.LOG_ALERT, message % pid) sys.stderr.write(message % pid) sys.exit(1) pid = self.daemonize() print "Starting daemon.\n" syslog.syslog(syslog.LOG_ALERT, "Starting daemon.") self.descriptors() self.run() def stop(self): try: pf = file(self.pidfile,'r') pid = int(pf.read().strip()) pf.close() except IOError: pid = None if not pid: message = "Daemon not running? (check %s)\n" syslog.syslog(syslog.LOG_ALERT, message % self.pidfile) sys.stderr.write(message % self.pidfile) return print "Stopping daemon.\nWaiting for PID: %s\n" % pid syslog.syslog(syslog.LOG_ALERT, "Stopping daemon.\nWaiting for PID: %s\n" % pid) try: while 1: os.kill(pid, SIGTERM) time.sleep(0.1) except OSError, err: err = str(err) if err.find("No such process") > 0: if os.path.exists(self.pidfile): os.remove(self.pidfile) else: print str(err) sys.exit(1) def restart(self): self.stop() self.start()
[/spoiler]

Останавливаем его из диалплана через System:

Код: Выделить всё

exten => h,1,System(/usr/local/etc/asterisk/daemon/gDaemonP.py stop)
В логах видим что он якобы остановился, но при этом он остается висеть в процессах.
Если запускать или останавливать его из консоли (вручную), то все ок. Такое ощущение, что на что-то не хватает прав...
#2 09.11.2012 06:02
Всё хорошо, всем спасибо хотя бы за прочтение.
После двухдневного взрыва мозга данной проблемой неожиданно выяснилось, что данный демон нам и не надо останавливать :lol: Главное что он переданные ему аргументы принимает нормально, а остальное дело техники :)
#3 12.09.2014 12:26
Ну, если заказчик оплатил двухдневный взрыв мозга - в общем-то ничего страшного. :D