按照标题:
设置cron作业的最好方法是检查一个长时间运行的进程是否还在进行,如果没有,启动它?
如果我在cron启动一个长时间运行的进程,它会阻塞吗? 还是cron叉作为一个独立的孩子的过程?
谢谢!
设置cron作业的最好方法是检查一个长时间运行的进程是否还在进行,如果没有,启动它?
一个简单的方法是有一个简单的脚本来检查进程是否正在运行,然后在必要时重新启动它。
(有时最好通过“虚拟事务”来validation进程是否正在运行,例如validationSMTP进程是否可以build立TCP端口连接并检查它是否正确响应。)
但是要注意你作为交互式用户的环境和cron(8)运行你的脚本之间的差异。
回答你的问题的第二点:
如果我在cron启动一个长时间运行的进程,它会阻塞吗? 还是cron叉作为一个独立的孩子的过程?
cron(8)将fork来执行一个cron作业,但除非你的脚本或进程“分离”,否则cron会将其作为一个subprocess保留,直到它退出(这就是cron如何从stderr收集所有输出,并通过电子邮件。)
但是,我想你在想,你能不能从cron运行这个长期运行的程序? 如果你这样做,你需要确保它只能启动自己的一个副本,如果它已经在运行,它会很快退出。
保持长时间运行的stream程运行的更好的解决scheme – 如果你只是担心退出或崩溃
一个常见的习惯用法是长时间运行一个pid文件。 基本上是一个文件在/var/run或类似的,只有程序的PID或进程ID。 当程序启动时,将文件放在那里,当它停止时,它将删除文件。 通过查看该文件是否存在,您可以轻松检查该程序是否存在。
这也可以用来查看程序是否崩溃。 如果该文件存在,但没有进程运行该pid,则程序停止,但没有删除pid文件,即它崩溃了。 在这种情况下,您可以删除pid文件并重新启动程序。 然而,这并不是一种愚蠢的certificate,因为有时PID会被原来的一个崩溃后开始的新过程重用。
根据你如何检测你的过程,cronjob可能看起来像
* * * * * pidof可执行文件|| 在/ usr / local / bin目录/可执行文件
前提是您的可执行文件在进程列表中显示为自己。 更明智的方法是使用pidfile并使用start-stop-daemon。 实际上,这一切都取决于所讨论的过程。 前一段时间,我也为此写了一个小进程维护守护进程dudki 。
不,cron不会阻塞,但是依赖于你的进程的性质,无论如何你都可能想要将其背景化。
“长时间运行”是指你需要花很长时间才能运行的东西,还是应该持续运行的守护进程?
如果你的意思是一个需要很长时间才能完成的过程,那么就像build议的那样,创build一个pid文件并在启动时查找该文件。 如果文件存在,则发出消息并完整地退出。 否则照常启动。
如果你的意思是一个守护进程(有时称为服务),而不是使用cron,你应该看看ps-watcher ,我用它来做同样的事情。
从网站:“…它可以用来确保一个守护进程正在运行,或运行不是太多次,它也可以用来确定一个进程消耗了太多的资源,可能是由于内存泄漏“。
您只需configurationps-watcher即可查找您的进程。 ps-watcher将检查进程列表,如果没有find,ps-watcher会为你启动它。
monit被devise来解决这个问题。