我有可以由连接到服务器的任何用户运行的脚本。此脚本写入单个日志文件,但对谁可以一次使用它没有限制。因此,多人可能会尝试写入日志,数据可能会丢失。是否有一种方法可以让代码的一个实例知道该代码的其他实例是否正在运行?此外,是否可以动态收集此信息? (即在第一个用户完成他/她的任务之前,不允许为第二个用户保存数据)
我知道我可以用文本文件做到这一点。因此,我可以在启动时将用户名写入文件,然后在完成时将其删除,但如果任一步骤未命中,则可能导致错误,例如意外的脚本终止。那么有什么其他可靠的方法呢?
系统的一些信息:Python 2.7通过Anaconda安装在Windows 7 64位服务器上。所有连接的机器也是Windows 7 64位。提前致谢
答案 0 :(得分:0)
这是一个实现:
http://www.evanfosmark.com/2009/01/cross-platform-file-locking-support-in-python/
如果您正在使用锁,请注意过时锁(由挂起或崩溃的进程留下的)可能是一个婊子。有一个进程定期搜索超过X分钟前创建的锁并释放它们。
它只是不干净,允许多个用户写入单个日志并希望事情顺利。 你为什么不写一个处理日志的守护进程?其他进程连接到“日志记录端口”,在最简单的情况下,只有在没有其他人连接的情况下,它们才会成功。 你可以修改这里给出的echoserver示例:(在所有连接的服务器中保持超时)
http://docs.python.org/release/2.5.2/lib/socket-example.html
如果您想确切地知道谁记录了什么,并确保没有人未经授权,您可以使用unix sockest将其限制为仅限某些uid / gids等。 here is a very good example
答案 1 :(得分:0)
NTEventLogHandler可能是登录到给定Windows计算机/服务器的最简单方法,但是如果Unix服务器上有系统日志接收器,则使用SyslogHandler可能更有意义。
用SyslogHandler可以想到的问题是,您可能需要在Windows防火墙上戳孔才能通过syslog协议(即514 / TCP(“可靠的syslog”))发送数据包和514 / UDP(传统或“不可靠的系统日志”)。