- python-daemon-1.5.2-1.el6.noarch
以下是我从开发人员那里收到的脚本:
import threading
import multiprocessing, os, signal, time, Queue
import time
from suds.client import Client
from hotqueue import HotQueue
from config import config
queue = HotQueue(config['redis_hotqueue_list'], host=config['redis_host'], port=int(config['redis_port']),password=config['redis_pass'], charset="utf-8",db=0)
@queue.worker()
def sendMail(item):
key = item[0]
domain = item[1]
fromemail = item[2]
fromname = item[3]
subject = item[4]
content = item[5]
toemail = item[6]
cc = item[7]
bcc = item[8]
replyto = item[9]
# Convert to string variable
url = config['sendmail_tmdt_url']
client = Client(url)
client.service.send_mail(key,domain, fromemail,subject, content, toemail,fromname, '','','');
for i in range(10):
t = threading.Thread(target=sendMail)
t.setDaemon(True)
t.start()
while True:
time.sleep(50)
如您所见,他使用线程模块使其可以作为守护进程运行。
这是我的第一次尝试:
from daemon import runner
import logging
import time
import threading
import multiprocessing, os, signal, time, Queue
import time
from suds.client import Client
from hotqueue import HotQueue
from config import config
class Mail():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
self.pidfile_path = '/var/run/sendmailworker/sendmailworker.pid'
self.pidfile_timeout = 1
def run(self):
while True:
queue = HotQueue(config['redis_hotqueue_list'], host=config['redis_host'], port=int(config['redis_port']), password=config['redis_pass'], charset=r"utf-8", db=0)
@queue.worker()
def sendMail(item):
key = item[0]
domain = item[1]
fromemail = item[2]
fromname = item[3]
subject = item[4]
content = item[5]
toemail = item[6]
cc = item[7]
bcc = item[8]
replyto = item[9]
# Convert to string variable
url = config['sendmail_tmdt_url']
client = Client(url)
client.service.send_mail(key,domain, fromemail,subject, content, toemail, fromname, '', '', '');
logger.debug("result")
#sleep(50)
mail = Mail()
logger = logging.getLogger("sendmailworker")
logger.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler = logging.FileHandler("/var/log/sendmailworker/sendmailworker.log")
handler.setFormatter(formatter)
logger.addHandler(handler)
daemon_runner = runner.DaemonRunner(mail)
daemon_runner.daemon_context.files_preserve=[handler.stream]
daemon_runner.do_action()
它可以工作,但我必须在启动后按Ctrl-C才能获得 shell 提示:
/etc/init.d/sendmailworker start
Starting server
# started with pid 2586
^C
#
我怎样才能摆脱这个问题?
附加一个&符号没有帮助:
# /etc/init.d/sendmailworker start &
[1] 4094
# Starting server
started with pid 4099
^C
[1]+ Done /etc/init.d/sendmailworker start
#
正如@Celada 指出的那样:实际上,我已经有了我的shell 提示符,但它没有[root@hostname ~]#
像往常一样显示,只是一个闪烁的光标。简单的按下Enter使我的shell提示重新出现。所以问题应该是:如何started with pid xxxxx
先出现,在同一行Starting server
,然后显示我的shell提示符?
该stop
功能工作正常:
[root@hostname ~]# /etc/init.d/sendmailworker stop
Stopping server
Terminating on signal 15
[root@hostname ~]#
我怎样才能为该start
功能做类似的事情?像这样的东西:
[root@hostname ~]# /etc/init.d/sendmailworker start
Starting server
started with pid 30624
[root@hostname ~]#