Linux 监视进程

Linux 监视进程,linux,process,Linux,Process,有没有一种方法可以监视一个进程,如果它死掉了,可以调用一个脚本来恢复进程?我不久前写了一个脚本。也有更强大的解决方案,但这一个很简单,对我来说很有用。monit 或者,您可以删除while循环和sleep,并将脚本放入cron作业集中,以便每分钟运行一次。最简单的方法是让初始父级进行监视。例如 #!/bin/sh while true; do cmd # When you get here the process has died. start # the loop again

有没有一种方法可以监视一个进程,如果它死掉了,可以调用一个脚本来恢复进程?

我不久前写了一个脚本。也有更强大的解决方案,但这一个很简单,对我来说很有用。

monit


或者,您可以删除while循环和sleep,并将脚本放入cron作业集中,以便每分钟运行一次。最简单的方法是让初始父级进行监视。例如

#!/bin/sh while true; do cmd # When you get here the process has died. start # the loop again and restart it done #!/垃圾箱/垃圾箱 虽然真实;做 指令 #当你到了这里,这个过程就结束了。开始 #再次启动循环并重新启动它 完成 此脚本可能会被终止,因此您可能需要 捕捉信号,但对任何人都是如此 你可能会写的监视器。你可能会 如果cmd正在终止,还希望插入延迟 立即,或添加一些日志记录(调用记录器
在您调用cmd之后)。没有必要太过花哨。

如果您使用的是SysV系统(而不是Upstart),您可以将do respawn进程放在inittab上

只需编辑/etc/inittab文件并添加如下行:


proc:12345:respawn:/path/to/process

完成任务的方法有很多:

  • 按照其他人的建议-运行脚本以检查进程是否正在运行,如果没有运行,请重新启动进程。要检查进程是否正在运行,可以使用
    pgrep | wc-l
  • 用于在一段时间间隔后运行脚本,以检查进程是否正在运行,如果没有,则重新启动进程
  • 创建一个父进程,它将始终查找子进程,如果子进程崩溃或停止,将通知父进程,然后重新启动新进程
  • 是一个复杂的进程管理器,可用于大多数主要的Linux发行版。

    使用您在一个简单版本中指定的,可以启动、监视和重新启动意外死亡的进程

    考虑一下
    /etc/Supervisor/conf.d/forever.conf
    中的以下监控器配置文件片段,它每秒显示一次日期和时间:

    [program:forever]
    command=/bin/bash -c 'while true; do echo "Current time is `date`"; sleep 1; done;'
    
    程序
    永远
    以PID 15474开始:

    derek@derek-lubuntu:~/Projects/fire$ sudo supervisorctl status forever
    forever                          RUNNING   pid 15474, uptime 0:00:17
    derek@derek-lubuntu:~/Projects/fire$ sudo supervisorctl tail forever
    Current time is Fri Jul  7 17:11:10 EDT 2017
    Current time is Fri Jul  7 17:11:11 EDT 2017
    Current time is Fri Jul  7 17:11:12 EDT 2017
    Current time is Fri Jul  7 17:11:13 EDT 2017
    Current time is Fri Jul  7 17:11:14 EDT 2017
    Current time is Fri Jul  7 17:11:15 EDT 2017
    Current time is Fri Jul  7 17:11:16 EDT 2017
    Current time is Fri Jul  7 17:11:17 EDT 2017
    Current time is Fri Jul  7 17:11:18 EDT 2017
    Current time is Fri Jul  7 17:11:19 EDT 2017
    Current time is Fri Jul  7 17:11:20 EDT 2017
    Current time is Fri Jul  7 17:11:21 EDT 2017
    Current time is Fri Jul  7 17:11:22 EDT 2017
    Current time is Fri Jul  7 17:11:23 EDT 2017
    Current time is Fri Jul  7 17:11:24 EDT 2017
    Current time is Fri Jul  7 17:11:25 EDT 2017
    
    永久终止
    进程,并且主管使用新进程ID 15760自动重新启动该进程:

    derek@derek-lubuntu:~/Projects/fire$ sudo kill 15474
    derek@derek-lubuntu:~/Projects/fire$ sudo supervisorctl status forever
    forever                          RUNNING   pid 15760, uptime 0:00:02
    derek@derek-lubuntu:~/Projects/fire$ sudo supervisorctl tail forever
    Current time is Fri Jul  7 17:11:21 EDT 2017
    Current time is Fri Jul  7 17:11:22 EDT 2017
    Current time is Fri Jul  7 17:11:23 EDT 2017
    Current time is Fri Jul  7 17:11:24 EDT 2017
    Current time is Fri Jul  7 17:11:25 EDT 2017
    Current time is Fri Jul  7 17:11:26 EDT 2017
    Current time is Fri Jul  7 17:11:27 EDT 2017
    Current time is Fri Jul  7 17:11:28 EDT 2017
    Current time is Fri Jul  7 17:11:29 EDT 2017
    Current time is Fri Jul  7 17:11:30 EDT 2017
    Current time is Fri Jul  7 17:11:31 EDT 2017
    Current time is Fri Jul  7 17:11:32 EDT 2017
    Current time is Fri Jul  7 17:11:33 EDT 2017
    Current time is Fri Jul  7 17:11:34 EDT 2017
    Current time is Fri Jul  7 17:11:35 EDT 2017
    Current time is Fri Jul  7 17:11:36 EDT 2017
    

    您可能会在serverfault上得到更好的答案。与其将问题“暂停作为非主题”,为什么不将其移到超级用户或服务器故障所在的位置?谢谢:)看起来对我来说非常合适。monit不提供一段时间内进程的图表/统计信息,对吗?只是一个指针。我扩展了我的答案。我现在认为这是最好的答案之一。然而,即使是以最初的形式,我的答案也并不比推荐Monit的答案更缺乏上下文(见stackoverflow.com/a/2354030/107158)。
    derek@derek-lubuntu:~/Projects/fire$ sudo kill 15474
    derek@derek-lubuntu:~/Projects/fire$ sudo supervisorctl status forever
    forever                          RUNNING   pid 15760, uptime 0:00:02
    derek@derek-lubuntu:~/Projects/fire$ sudo supervisorctl tail forever
    Current time is Fri Jul  7 17:11:21 EDT 2017
    Current time is Fri Jul  7 17:11:22 EDT 2017
    Current time is Fri Jul  7 17:11:23 EDT 2017
    Current time is Fri Jul  7 17:11:24 EDT 2017
    Current time is Fri Jul  7 17:11:25 EDT 2017
    Current time is Fri Jul  7 17:11:26 EDT 2017
    Current time is Fri Jul  7 17:11:27 EDT 2017
    Current time is Fri Jul  7 17:11:28 EDT 2017
    Current time is Fri Jul  7 17:11:29 EDT 2017
    Current time is Fri Jul  7 17:11:30 EDT 2017
    Current time is Fri Jul  7 17:11:31 EDT 2017
    Current time is Fri Jul  7 17:11:32 EDT 2017
    Current time is Fri Jul  7 17:11:33 EDT 2017
    Current time is Fri Jul  7 17:11:34 EDT 2017
    Current time is Fri Jul  7 17:11:35 EDT 2017
    Current time is Fri Jul  7 17:11:36 EDT 2017