我有一个每五分钟就在cron上运行一个进程.通常,运行只需几秒钟,但有时需要几分钟.我想确保一次只运行一个版本.
我试了一个明显的方法......
File.open("/tmp/indexer_lock.tmp",'w') do |f| exit unless f.flock(File::LOCK_EX) end
...但它没有测试它是否可以获得锁定,它会在锁定被释放之前阻塞.
知道我错过了什么吗?我宁愿不使用ps来破解某些东西,但这是另一种选择.
我知道这是旧的,但对于任何有兴趣的人,都有一个非阻塞常量可以传递给flock,以便它返回而不是阻塞.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
flock
如果此进程收到锁定,则返回true ,否则返回false.因此,要确保一次只运行一个进程,您只想尝试获取锁定,如果无法执行则退出.它就像放在exit unless
我上面的代码行前面一样简单:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )