【问题标题】:Jython 2.5.3 and time.sleepJython 2.5.3 和 time.sleep
【发布时间】:2012-12-04 22:18:43
【问题描述】:

我正在开发一个小型的内部替代 Tripwire,所以我编写了一个小脚本来散列 JBoss EAP 服务器中的文件,并将路径和散列存储在 MySQL 数据库中。

脚本每天都会将文件系统中的哈希值与保存在数据库中的哈希值进行比较,因此任何更改都会被记录并最终使用 JasperServer 进行报告。

该脚本在晚上使用 cron 运行,以避免大量脚本在执行有趣的事情之前同时使用 time.sleep(RANDOM_NUMBER_OF_SECONDS) 来查询数据库,但有时 time.sleep 似乎永远睡眠并且脚本结束时没有任何错误,我检查了 cron 发送的邮件,没有记录任何错误。任何帮助,将不胜感激。我正在使用 jython-standalone-2.5.3,IBM 的 JDK 和 RHEL 5.6 在 VMWare 中运行。

我刚刚找到http://bugs.jython.org/issue1974 并且代码注释似乎指出操作系统信号可能导致这种行为,但不确定这是否是我的情况。

如果你想在http://code.google.com/p/pysnapshot/查看代码结帐

路易斯·加西亚·布斯托斯。

【问题讨论】:

    标签: vmware jython jdk1.6 rhel5


    【解决方案1】:

    我不知道你为什么认为time.sleep() 可以减少查询数据库的脚本数量。

    IMO ot 最好使用cron 定期调用该程序。启动后,它应该检查/tmp/ 目录中是否有“信号量”文件,例如/tmp/snapshot_working.txt。如果没有信号量文件,则创建它并写入类似:“快照开始:2012-12-05 22:00:00”。在您的程序完成检查后,它应该删除此文件。如果在启动时程序会找到信号量文件,那么它可以停止或检查保存在此文件中的日期和时间是否看起来“旧”。如果它是“旧的”,则将其删除并开始正常写入日志以发现“旧”文件已找到(管理员可以找到如此长时间的工作快照并终止它)。

    在您的情况下创建time.sleep() 的唯一原因是,如果您想在正常工作时间使用此类脚本而不会对您的数据库进行拒绝服务攻击。示例:在进行 100 次 DB 查询后,您可以少睡一会儿,并让 DB 有时间为其他用户查询提供服务。但我认为程序越早结束越好。

    【讨论】:

    • 嗨!你是对的,我使用 time.sleep 因为 MySQL 无法处理负载,在 100 多台服务器上运行,因为我同时启动所有脚本(在批处理窗口)并使用事务 - 因为“部分快照”对于完整性检查毫无用处 - MySQL 根本无法处理它并且事务开始中止,所以我使用一种“指数退避”来恢复。主要问题是当我在重试操作之前让脚本等待(使用 time.sleep)时,它似乎永远不会醒来。我根本没有使用线程。
    • 你启动了多少个脚本?他们使用相同的 MySQL 服务器吗?你检查一个文件系统吗?为什么不启动一个脚本来检查一个又一个目录(长命令行或配置文件)?
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2013-12-23
    • 2019-11-05
    相关资源
    最近更新 更多