0

我有脚本,任何连接到服务器的用户都可以运行该脚本。此脚本写入单个日志文件,但对谁可以一次使用它没有限制。因此,多个人可能会尝试写入日志并且数据可能会丢失。有没有办法让一个代码实例知道该代码的其他实例是否正在运行?此外,是否可以动态收集这些信息?(即在第一个用户完成他/她的任务之前不允许为第二个用户保存数据)

我知道我可以用一个文本文件来做到这一点。所以我可以在启动时将用户名写入文件,然后在完成时将其删除,但是如果任一步骤丢失,这可能会导致错误,例如意外的脚本终止。那么还有哪些可靠的方法呢?

有关系统的一些信息: Python 2.7 通过 Anaconda 安装在 Windows 7 64 位服务器上。所有连接的机器也是 Windows 7 64 位。提前致谢

4

2 回答 2

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 将其限制为仅某些 uids/gids 等。 这是一个很好的例子

于 2013-11-14T14:47:54.663 回答
0

NTEventLogHandler可能是记录到给定 Windows 机器/服务器的最简单方法,但如果您在 Unix 服务器上有 syslog 接收器,则使用 SyslogHandler 可能更有意义。

我能想到的SyslogHandler的问题是,您可能需要通过 Windows 防火墙戳洞,以便通过 syslog 协议发送数据包,即 514/TCP(“可靠的 syslog”)和 514/UDP(传统或“不可靠的系统日志”)。

于 2019-01-15T09:10:47.010 回答