我有许多用Python 2.6编写的脚本,可以任意运行。我希望有一个中央脚本来收集输出并将其显示在一个日志中。
理想情况下,它会满足这些要求:
我遇到了一些提示:
os.pipe()
multiprocess
mutex
logging.handlers.SocketHandler
(感谢@Dan Head)从这些方面来看,我想我可以拼凑一些东西。只是想知道是否有一种明显的“正确”方式,或者我是否可以从任何人的错误中吸取教训。
答案 0 :(得分:5)
我会考虑使用logging.handlers.SocketHandler
来传递部分消息,听起来你已经记住了一个记录类型用例。
标准库日志记录工具非常灵活且配置驱动,因此您应该能够根据您的要求进行调整。
这不处理问题的自动重启部分。对于UNIX,您可能只是使用pid文件和os.kill(pid, 0)
来检查它是否正在运行,但我不知道它们在Windows世界中的等价物是什么。
答案 1 :(得分:1)
我使用以下密钥代码构建了一个使用Windows命名管道的服务器:
def run( self ):
# This is the main server loop for the Win32 platform
import win32pipe
import win32file
self.pipeHandle = win32pipe.CreateNamedPipe(
'\\\\.\\pipe\\myapp_requests',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_BYTE |
win32pipe.PIPE_READMODE_BYTE |
win32pipe.PIPE_WAIT,
1,
4096,
4096,
10000,
None)
if self.pipeHandle == win32file.INVALID_HANDLE_VALUE:
print 'Failed to create named pipe %s!' % self.pipeName
print 'Exiting...'
sys.exit(1)
while True:
# Open file connection
win32pipe.ConnectNamedPipe( self.pipeHandle )
# Run the main message loop until it exits, usually because
# of a loss of communication on the pipe
try:
self.messageLoop()
except ServerKillSignal:
break
# Return the pipes to their disconnected condition and try again
try: win32pipe.DisconnectNamedPipe( self.pipeHandle )
except: pass
win32file.CloseHandle( self.pipeHandle )
print "Exiting server"
方法messageLoop()
使用win32file.ReadFile()
从管道读取数据,直到抛出win32file.error。然后它退出,允许run()重新启动它。
在我的实现中,用户不太可能具有管理员访问权限,因此无法作为系统服务启动。相反,我编写了客户端来检查'\。\ pipe \ pyccf_requests'中是否存在管道。如果它不存在,则客户端启动新的服务器进程。
答案 2 :(得分:0)
项目#2,“如果第一个脚本尝试发送消息时接收器没有运行,它就会启动”,可能无法正常工作。必须运行一些东西来接收消息。我建议编写一个恶魔进程,它在启动时启动,并告诉Windows如果它死了就重新启动它。