在Linux中创build自动重启脚本

我的linux系统上有一个小型的日志logging工具,每隔20-30分钟就需要重新启动一次,因为日志节点每隔一段时间closures会话。

你将如何去创build一个脚本来重新启动一个sw。

起动工具的命令将是这样的事情

root @ 25-3b-1d-46-3f-13:/ home /#logdrift -f 10.15.12.10 test.log

当它重新启动时,它需要添加一个数字到test.log文件名,如test1.log

Montecristo的cron命令是每20分钟安排一次工作的好方法。 正如所写的,它将启动一个新的“命令”实例,而不会杀死旧的实例。 它也不在“test1.log”中放置一个logging。

我假设目标程序被命名为“#logdrift”(前面的哈希是合法的,但它提出了一些尴尬的转义问题),并且你需要一直在运行它的一个实例。

而不是让cron条目直接运行目标进程,我会创build一个简单的包装脚本并每20分钟执行一次。 在这里,包装将有3个职责:

  • 杀死目标进程的正在运行的实例
  • 启动目标进程的新实例
  • 在test1.log中创build一个logging

但是,大多数程序不应该要求定期重启。 而不是像cron作业和包装脚本一样提供一个快速的解决方法,解决潜在的问题可能更合适。

我会使用logrotate来做到这一点,然后你可以设置一个postrotate脚本(使用postrotate指令),它是从logrotate激活来重新启动该程序的。 传统上,该程序应该采取一个SIGHUP信号重新打开它的日志,但我从来没有听说过logdrift。

Logrotate将会使用cron来调用(这是你用来每X分钟,几小时,几天等运行任何东西)。 Logrotate还将处理增加日志,通过采取以前的日志,使他们log.1,然后做log.1 log.2等…

如果这个程序是一个守护进程,我会创build一个init脚本来启动并停止它。 这篇文章有一个关于如何做到这一点的红帽像系统的例子。 有关程序如何停止和启动的示例,请参阅/etc/init.d/中的脚本。

*/20 * * * * /path/to/your/command 

这每20分钟运行一次。
要更改日志文件的编号,您可以查看它所在的目录并parsing它的名称,如果它没有编号,新文件将在该点之前有1,如果它有一个数字,只需将它加1。
我个人不喜欢有一个更广泛的variables来维持统计的想法。

现在已经有一个很好的工具可以让很多人忘记: init

我build议增加:

 ld:35:respawn:/usr/local/bin/logdrift -f 10.15.12.10 test-$(%F-%T).log 

到/ etc / inittab。

唯一需要担心的是,如果进程重新启动速度太快(2分钟内> 10次),将会拒绝重新运行5分钟。 考虑一个function。 🙂

如果你有一个调用logrotate的启动脚本,你可以使用respawn指令把它放在inittab中。 这将在任何时候终止时重新开始该过程。

在cron中:

 * * * * sun,tue,thu,sat shutdown -r now 

这将在星期天,星期二,星期四和星期六重新启动。