确定Ruby脚本是否已经在运行
时间:2020-03-05 18:46:04 来源:igfitidea点击:
有没有一种简单的方法可以判断ruby脚本是否已经在运行,然后对其进行适当的处理?例如:我有一个名为real_long_script.rb的脚本。我讨厌每5分钟跑步一次。当它运行时,我想看看之前的运行是否仍在运行,然后停止执行第二个脚本。有任何想法吗?
解决方案
回答
在bash中:
if ps aux | grep really_long_script.rb | grep -vq grep then echo Script already running else ruby really_long_script.rb fi
回答
ps是这样做的一种非常差劲的方法,并且可能会遇到比赛条件。
传统的Unix / Linux方法是将PID写入文件(通常在/ var / run中),并在启动时检查该文件是否存在。
例如如果pidfile位于/var/run/myscript.pid,则在运行程序之前,我们需要检查该文件是否存在。有一些技巧可以避免争用情况,其中包括使用O_EXCL(不包括锁定)来打开文件和符号链接。
但是不太可能,我们应该尝试通过在文件系统上使用原子操作来编写代码来避免出现竞争情况。
为了节省重新发明的负担,我们可能需要查看http://rubyforge.org/projects/pidify/
回答
我们可能还应该检查该进程是否确实在运行,这样,如果脚本在没有清理的情况下就死了,它将在下次运行,而不是简单地检查
/var/run/foo.pid存在并退出。