![在 Linux 中创建自动重启脚本](https://linux22.com/image/495008/%E5%9C%A8%20Linux%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF%E8%84%9A%E6%9C%AC.png)
我的 Linux 机器上有一个小型日志工具,需要每 20-30 分钟重新启动一次,因为日志节点会不时关闭会话。
您将如何创建脚本来使软件以这样的方式重新启动。
启动该工具的命令如下
root@25-3b-1d-46-3f-13:/home/#logdrift -f 10.15.12.10 test.log
当它重新启动时,它需要在 test.log 文件名中添加一个数字,例如 test1.log
答案1
Montecristo 的 cron 命令是每 20 分钟安排一次作业的好方法。不过,正如所写,它将启动“命令”的新实例,而不会终止旧实例。它也不会在“test1.log”中放置记录。
我假设目标程序名为“#logdrift”(前导哈希是合法的,但它存在一些尴尬的转义问题),并且您需要始终运行一个实例。
我不会让 cron 条目直接运行目标进程,而是创建一个简单的包装器脚本并每 20 分钟执行一次。这里,包装器有 3 个职责:
- 终止目标进程的正在运行的实例
- 启动目标进程的新实例
- 在test1.log中做记录
但是,大多数程序都不需要定期重启。与其使用 cron 作业和包装脚本等快速解决方法,不如直接解决根本问题。
答案2
我会用日志旋转为此,您可以设置一个后旋转脚本(使用 postrotate 指令),该脚本由 logrotate 激活以重新启动该程序。传统上,该程序应该接收 SIGHUP 信号以重新打开其日志,但我从未听说过 logdrift。
Logrotate 将使用 cron 调用(您可以使用 cron 每隔 X 分钟、小时、天等运行任何操作)。Logrotate 还将处理增量日志,方法是获取先前的日志并将其设为 log.1,然后设为 log.1 log.2 等等...
如果这个程序是一个守护进程,我会创建一个启动和停止它的初始化脚本。这个文章有一个关于如何在类似 redhat 的系统上执行此操作的示例。请参阅 /etc/init.d/ 中的脚本,获取有关如何停止和启动程序的示例。
答案3
*/20 * * * * /path/to/your/command
每 20 分钟运行一次。
要更改日志文件的编号,您可以查看其所在的目录并解析其名称,如果它没有编号,则新文件的点前会有一个 1,如果它有编号,则只需向其添加 1。
我个人不喜欢使用范围更广的变量来保存计数的想法。
答案4
如果您有一个调用 logrotate 的启动脚本,那么您可以将其放入 inittab 中,并添加 respawn 指令。这样,每次进程终止时,它都会重新启动。