racbear Asked: 2009-06-01 06:57:21 +0800 CST2009-06-01 06:57:21 +0800 CST 2009-06-01 06:57:21 +0800 CST 当一个守护进程死亡时执行某些东西的Shell脚本? 772 我只需要构建两个在不同端口上运行的守护进程实例。假设它们都服务于某些应用程序的关键任务。 当其中一个无法服务时,如何执行一些自动任务(例如 shell 脚本)来检查两个守护进程? 什么样的脚本可以始终检查守护程序的生命,并且如果其中一个守护程序意外停止,也许可以执行其他一些工作? scripting shell daemon 7 个回答 Voted Best Answer drybjed 2009-06-01T07:27:45+08:002009-06-01T07:27:45+08:00 monit在这种情况下很棒 - 它在 localhost 上运行,因此您不需要网络连接来重新启动您的守护程序(以防它失败,或者守护程序负责网络)。它在系统上的占用空间也很小,您可以使用它来监控您的其他守护进程/磁盘空间/等。也是。 创建一个启动/停止脚本(类似于在/etc/init.d/系统用于正常操作的运行级别中为它创建符号链接,确保您的守护程序将在重新启动时启动并在正常关闭时停止。如果您的守护程序没有 pidfile,请创建一个使用start-stop-daemon脚本。 之后,monit为您的守护程序安装并创建配置,如下所示: 使用 pidfile /var/run/daemond.pid 检查进程守护进程 启动程序“/etc/init.d/daemond start” 停止程序“/etc/init.d/daemond stop” 如果在 10 个周期内 5 次端口 1234 类型 TCP 失败,则重新启动 如果 3 个在 5 个周期内重新启动,则发出警报 此配置将确保如果守护程序在 tcp 端口 1234 上停止响应,或者将停止运行,它将使用 init 脚本重新启动。monit还会通过电子邮件向您发送警报,或执行其他操作,具体取决于您的配置方式。只需查看monit(1)手册页。 Xerxes 2009-06-01T07:03:06+08:002009-06-01T07:03:06+08:00 很大程度上取决于守护进程。 如果守护程序有一个 API,并且您可以通过 TCP/IP 套接字或 UNIX 套接字与其通信,那么您可以这样做。 例如,如果它侦听 TCP/IP 端口,您可以编写一个连接到它的脚本,期望得到某个响应 - 以及获得该响应所需的时间 - 您可以将其提供给监控工具,例如 nagios, munin 或其他 - 无论您最终编写什么脚本来执行单个检查,您都可以轻松地集成到例如 nagios 插件中 - 这可能是您想要做的 - 一旦您编写了检查脚本。 如果它没有为您提供任何有用的信息,不监听端口,那么您真正能做的就是使用 lsof、netstat 或类似的东西检查进程树,并确保它存在,但您不能真正做到健康查看。 您需要更加具体,才能在这里的任何人为您提供有用的东西。 查看正在运行的守护进程的 PID,然后查看下面/proc/<PID>/fd的视图以了解守护进程正在与之交互的管道/套接字/文件 - 这可能会帮助您入门。 Matt Simmons 2009-06-01T07:04:52+08:002009-06-01T07:04:52+08:00 我的建议是使用您(希望)现有的监控基础设施。 我使用 Nagios,并使用 SNMP 查询我的 Linux 机器。Linux MIB 允许我检索所有正在运行的进程的名称,以及 PID 和参数。我用它来监视不打开端口的各种守护进程(如 crond)。 Outdoor 2009-06-01T07:28:20+08:002009-06-01T07:28:20+08:00 好吧,我有一个最喜欢的检查方法,当它死去时,它非常简单。只需使用以下命令启动它: /path/to/daemon || mail [email protected] "/path/to/daemon dead; do X" 或: 而 [[ -z "" ]]; 做/path/to/daemon || mail [email protected] "/path/to/daemon 死了;重新启动"; 完毕 或类似的东西。如果出现问题时守护程序将退出,这将为您提供非常简单和可靠的监控。 Simon Kelly 2009-06-01T09:27:59+08:002009-06-01T09:27:59+08:00 也许您可以尝试使用 init 守护程序启动任务(假设这是 Unix,其他答案似乎已经完成)。查看 inittab 的手册页,其中应详细说明如何操作。您可以安排您的进程在引导时启动,或在特定的运行级别启动。 如果您使用 respawn 选项,那么您的进程将在失败时自动重新启动 - 即 init 守护进程是一个内置的进程监视器以及进程启动器。但是,init 守护进程也有一些“智能”,因此如果您的守护进程在太短的时间内过于频繁地重新启动,那么最终 init 将停止尝试再次启动它几分钟。例如,这使得流氓进程更难意外消耗机器上的所有 CPU。 init 通常也会被配置为在 /var/log 某处记录条目,因此您可以免费获得日志记录。 tylerl 2009-06-01T13:03:47+08:002009-06-01T13:03:47+08:00 不知道为什么没有人列出明显的简单解决方案: #!/bin/bash ps ax | grep "[p]rogie" >/dev/null 2>&1 if [ $? != 0 ] ; then # do something fi Daniel Lawson 2009-06-01T13:46:59+08:002009-06-01T13:46:59+08:00 我会通过像 nagios 这样的网络监控工具或像其他海报之一推荐的自定义脚本来推荐monit或god来完成此类任务。 另一张海报包含了 Monit 的配置片段;上帝在概念上相似,但用红宝石写成。这两个工具都是为处理这种情况而编写的,并且提供比自定义脚本更大的灵活性(如果进程存在但没有响应怎么办?如果你的 grep 匹配一个你没有预料到的不同进程怎么办? ? ) 并提供“开箱即用”的阈值和滞后支持。 我可能将 Nagios 用作单独的警报和通知路径,但我不会将其用作监视和重新启动进程的唯一方式,原因与我不会使用手写脚本相同——它没有提供足够的灵活性对于大多数监控情况,虽然您可以触发事件(例如重新启动服务),但它没有像 monit 这样的工具那样灵活。
monit
在这种情况下很棒 - 它在 localhost 上运行,因此您不需要网络连接来重新启动您的守护程序(以防它失败,或者守护程序负责网络)。它在系统上的占用空间也很小,您可以使用它来监控您的其他守护进程/磁盘空间/等。也是。创建一个启动/停止脚本(类似于在
/etc/init.d/
系统用于正常操作的运行级别中为它创建符号链接,确保您的守护程序将在重新启动时启动并在正常关闭时停止。如果您的守护程序没有 pidfile,请创建一个使用start-stop-daemon
脚本。之后,
monit
为您的守护程序安装并创建配置,如下所示:此配置将确保如果守护程序在 tcp 端口 1234 上停止响应,或者将停止运行,它将使用 init 脚本重新启动。
monit
还会通过电子邮件向您发送警报,或执行其他操作,具体取决于您的配置方式。只需查看monit(1)
手册页。很大程度上取决于守护进程。
如果守护程序有一个 API,并且您可以通过 TCP/IP 套接字或 UNIX 套接字与其通信,那么您可以这样做。
例如,如果它侦听 TCP/IP 端口,您可以编写一个连接到它的脚本,期望得到某个响应 - 以及获得该响应所需的时间 - 您可以将其提供给监控工具,例如 nagios, munin 或其他 - 无论您最终编写什么脚本来执行单个检查,您都可以轻松地集成到例如 nagios 插件中 - 这可能是您想要做的 - 一旦您编写了检查脚本。
如果它没有为您提供任何有用的信息,不监听端口,那么您真正能做的就是使用 lsof、netstat 或类似的东西检查进程树,并确保它存在,但您不能真正做到健康查看。
您需要更加具体,才能在这里的任何人为您提供有用的东西。
查看正在运行的守护进程的 PID,然后查看下面
/proc/<PID>/fd
的视图以了解守护进程正在与之交互的管道/套接字/文件 - 这可能会帮助您入门。我的建议是使用您(希望)现有的监控基础设施。
我使用 Nagios,并使用 SNMP 查询我的 Linux 机器。Linux MIB 允许我检索所有正在运行的进程的名称,以及 PID 和参数。我用它来监视不打开端口的各种守护进程(如 crond)。
好吧,我有一个最喜欢的检查方法,当它死去时,它非常简单。只需使用以下命令启动它:
/path/to/daemon || mail [email protected] "/path/to/daemon dead; do X" 或:
而 [[ -z "" ]]; 做/path/to/daemon || mail [email protected] "/path/to/daemon 死了;重新启动"; 完毕
或类似的东西。如果出现问题时守护程序将退出,这将为您提供非常简单和可靠的监控。
也许您可以尝试使用 init 守护程序启动任务(假设这是 Unix,其他答案似乎已经完成)。查看 inittab 的手册页,其中应详细说明如何操作。您可以安排您的进程在引导时启动,或在特定的运行级别启动。
如果您使用 respawn 选项,那么您的进程将在失败时自动重新启动 - 即 init 守护进程是一个内置的进程监视器以及进程启动器。但是,init 守护进程也有一些“智能”,因此如果您的守护进程在太短的时间内过于频繁地重新启动,那么最终 init 将停止尝试再次启动它几分钟。例如,这使得流氓进程更难意外消耗机器上的所有 CPU。
init 通常也会被配置为在 /var/log 某处记录条目,因此您可以免费获得日志记录。
不知道为什么没有人列出明显的简单解决方案:
我会通过像 nagios 这样的网络监控工具或像其他海报之一推荐的自定义脚本来推荐monit或god来完成此类任务。
另一张海报包含了 Monit 的配置片段;上帝在概念上相似,但用红宝石写成。这两个工具都是为处理这种情况而编写的,并且提供比自定义脚本更大的灵活性(如果进程存在但没有响应怎么办?如果你的 grep 匹配一个你没有预料到的不同进程怎么办? ? ) 并提供“开箱即用”的阈值和滞后支持。
我可能将 Nagios 用作单独的警报和通知路径,但我不会将其用作监视和重新启动进程的唯一方式,原因与我不会使用手写脚本相同——它没有提供足够的灵活性对于大多数监控情况,虽然您可以触发事件(例如重新启动服务),但它没有像 monit 这样的工具那样灵活。