linux + 在 shell 脚本中创建简单的看门狗进程

linux + 在 shell 脚本中创建简单的看门狗进程

我需要创建监视程序进程(将在 Linux 版本 5.x 中运行),该进程始终监视 /etc/cluster.cf 文件

如果该进程与 cluster.cf 文件中的字符串 machineA_is_active 匹配

然后这个进程会执行其他脚本

我的问题是 - 如何以 Linux 启动时进程始终运行的方式运行此进程 -

如果此进程停止,则需要重新启动此进程

那么请建议一下这个场景的基本结构是什么?

(如果我能得到真实的例子我会很高兴)

答案1

我不建议尝试让一个进程一直运行来执行此操作。还有更简单的方法。您的机器应该运行 cron,这是一个定期任务调度程序。您可以安排一个进程定期运行,频率为每分钟一次,以检查文件的内容并执行需要执行的操作。您可以在 crontab 中添加类似以下内容:

* * * * * /path/to/yourscript

请参阅man 1 crontabman 5 crontabman 8 cron了解有关 cron 的更多信息。

更好的方法是使用 incron,它允许您指定在更改此文件时运行的进程。如果您安装了 incron,则可以将以下内容添加到 incrontab:

/etc/cluster.cf IN_MODIFY /path/to/your/script

说任何时候 /etc/cluster.cf 被修改,运行你的脚本。man 5 incrontab参见man 1 incrontab

答案2

假设您正在使用 SysV 发行版,请创建一个初始化脚本并将其放在 /etc/init.d 中。

查看已存在的脚本,以获取有关如何格式化此脚本的示例。考虑使用守护进程函数的脚本。然后,您将使用它chkconfig来启用脚本在启动时运行。此初始化脚本应将其 PID 写入锁定文件。您将需要第二个“辅助进程”通过读取锁定文件来检查第一个进程的 PID,并确定它是否正在运行。如果找不到正在运行的 PID,则包括销毁锁定并重新启动第一个进程的逻辑。

答案3

有一个东西,它的唯一任务就是(重新)启动其他东西,它的名字是init,它是通过 进行配置的inittab。要使某样东西真正永垂不朽,请使用respawn选项将其添加到 inittab 中。

一个简单的检查脚本(的候选inittab)可能是这样的:

while :
do
     grep -q machineA_is_active /etc/cluster.cf && activation_script
     # here one needs to ensure the above wan't fire again
     # - say, by carelessly wiping off /etc/cluster.cf
     # or carefully editing out the triggering record
     sleep $delay
done

答案4

看门狗的一个非常简单的解决方案(不是最优雅的)是创建一个 cron 作业,执行一个服务来检查另一个服务的状态。

sudo crontab -e

然后将此行放在你的 crontab 文件的末尾(注意,这将每天每分钟运行,直到你再次更改 crontab)

* * * * * /usr/sbin/sample_service

然后按 CTRL-X、Y、ENTER 并重新启动机器。

这是此类服务的一个例子:

    #!/bin/bash
    #
    # watchdog
    #
    # Run as a cron job to keep an eye on what_to_monitor which should always
    # be running. Restart what_to_monitor and send notification as needed.
    #
    # This needs to be run as root or a user that can start system services.
    #
    # Revisions: 0.1 (20100506), 0.2 (20100507)

    NAME=sample_service
    NAME2=sample_service2
    START=/usr/sbin/$NAME
    START2=/usr/sbin/$NAME2
    [email protected]
    [email protected]
    GREP=/bin/grep
    PS=/bin/ps
    NOP=/bin/true
    DATE=/bin/date
    # MAIL=/bin/mail
    RM=/bin/rm

    $PS -ef|$GREP -v grep|$GREP $NAME >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME is NOT RUNNING. Starting $NAME and sending notices."
     $START 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

     # GT06
    $PS -ef|$GREP -v grep|$GREP $NAME2 >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME2 is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME2 is NOT RUNNING. Starting $NAME2 and sending notices."
     $START2 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME2 was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

    exit

相关内容