用基于文件的互斥锁预防Cron癌症
Perl(4)最近在工作中,我需要编写一个脚本,它将穿过与正则表达式匹配的目录的目录内容,对文件执行一些操作,然后之后删除文件。我不想一直在运行脚本,所以我决定添加一个cronjob每分钟运行脚本(如果没有任何文件来处理,则脚本立即终止)。
但是我的计划有一个皱纹:脚本可能会运行超过一分钟,并同时拥有两个脚本的副本将是一个坏事。在考虑到这个问题几分钟后,我意识到一个简单且足够的解决方案:使用文件作为互斥锁。
概念
系统的功能非常基本:
- 脚本开始时,请检查文件是否命名
my_script.lock.lock.lock.lock.lock.lock.
存在。 - 如果它不存在,则创建文件并将其保存为自欧洲时代以来的当前时间作为其目前的内容。
- 如果它确实存在,并且它以来的时间以来包含在它内部的时间在最后一小时内,则中止脚本。
- (除非您中止第三步)继续脚本。
- 脚本完成后,删除
my_script.lock.lock.lock.lock.lock.lock.
。
起初我没有打扰将时间戳放入文件中,而是通过添加时间戳,如果它已经被锁定在长时间不合时宜的时间(建议脚本崩溃),则可以将锁定过期(建议崩溃),而不会手动删除锁定文件。
Perl的实施
在Perl中实现基于文件的互斥锁是快速而无痛的。除非你是一个悲惨的perl编码器,否则它会带你一段时间来拼凑所有必要的文件。
我花了一段时间才会把它分成一会儿。
我的$ lock_file.='/tmp/my_script.lock';我的$ expire_lock_After.=60.*30.;亚被锁住了{#-e是一个检查文件存在的函数如果(-E.$ lock_file.){#这一行声明没有行分隔符当地的$ /=诺维;打开锁那“<$ lock_file”或者警告“无法打开$ lock_file”;我的$ TS=<锁定>;关闭锁;如果($ TS>时间()-$ expire_lock_After.){返回1;}}返回诺维;}亚锁{打开锁那“> $ lock_file”或者警告“无法打开$ lock_file”;打印锁时间();关闭锁;}亚开锁{解开($ lock_file.);}
如果(被锁住了)死“$ lock_file被锁定”;锁();打印'做任何事情';开锁();
是的。我仍然不明白Booleans的Perl-style。也许一种奇怪的奇怪将澄清一种更加惯用的方式来编写上述代码。如果他们这样做,我肯定会欣赏它1。
在我的跛脚防守中,我确实追求澄清Perl Booleans,但大多数答案似乎是Perl中的Booleans是
不明确的
和其他一切。这是答案的深刻吗?↩