Вызов скрипта через System.
Доброго времени суток. Такой вопрос:
Система: FreeBSD 8.2, Asterisk 1.8.15.1
Есть демон на Python, вот его часть:
[spoiler][/spoiler]
Останавливаем его из диалплана через 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()Останавливаем его из диалплана через System:
Код: Выделить всё
exten => h,1,System(/usr/local/etc/asterisk/daemon/gDaemonP.py stop)Если запускать или останавливать его из консоли (вручную), то все ок. Такое ощущение, что на что-то не хватает прав...