设置cron作业的最好方法是检查一个长时间运行的进程是否还在进行,如果没有,启动它?

按照标题:

设置cron作业的最好方法是检查一个长时间运行的进程是否还在进行,如果没有,启动它?

如果我在cron启动一个长时间运行的进程,它会阻塞吗? 还是cron叉作为一个独立的孩子的过程?

谢谢!

设置cron作业的最好方法是检查一个长时间运行的进程是否还在进行,如果没有,启动它?

一个简单的方法是有一个简单的脚本来检查进程是否正在运行,然后在必要时重新启动它。

(有时最好通过“虚拟事务”来validation进程是否正在运行,例如validationSMTP进程是否可以build立TCP端口连接并检查它是否正确响应。)

但是要注意你作为交互式用户的环境和cron(8)运行你的脚本之间的差异。

回答你的问题的第二点:

如果我在cron启动一个长时间运行的进程,它会阻塞吗? 还是cron叉作为一个独立的孩子的过程?

cron(8)将fork来执行一个cron作业,但除非你的脚本或进程“分离”,否则cron会将其作为一个subprocess保留,直到它退出(这就是cron如何从stderr收集所有输出,并通过电子邮件。)

但是,我想你在想,你能不能从cron运行这个长期运行的程序? 如果你这样做,你需要确保它只能启动自己的一个副本,如果它已经在运行,它会很快退出。

保持长时间运行的stream程运行的更好的解决scheme – 如果你只是担心退出或崩溃

  • 如果您的进程可以保持连接,请使用inittab(5)和“respawn”选项使用init(1)。 甚至守护进程也有“不分叉”选项。
  • 或者,如果您的操作系统没有inittabfunction,或者您无法访问它,请使用DJB的守护进程 。
  • 如果您有使用Solaris 10或OpenSolaris的优点,则可以使用SMF。 (这甚至可以和fork和detach的进程一起工作。)
  • 如果它是你自己的代码,你可以写它有一个父/子对进程,在父进程重新启动孩子收到一个SIGCHLD。

一个常见的习惯用法是长时间运行一个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来解决这个问题。