我需要创建监视程序进程(将在 Linux 版本 5.x 中运行),该进程始终监视 /etc/cluster.cf 文件
如果该进程与 cluster.cf 文件中的字符串 machineA_is_active 匹配
然后这个进程会执行其他脚本
我的问题是 - 如何以 Linux 启动时进程始终运行的方式运行此进程 -
如果此进程停止,则需要重新启动此进程
那么请建议一下这个场景的基本结构是什么?
(如果我能得到真实的例子我会很高兴)
答案1
我不建议尝试让一个进程一直运行来执行此操作。还有更简单的方法。您的机器应该运行 cron,这是一个定期任务调度程序。您可以安排一个进程定期运行,频率为每分钟一次,以检查文件的内容并执行需要执行的操作。您可以在 crontab 中添加类似以下内容:
* * * * * /path/to/yourscript
请参阅man 1 crontab
和man 5 crontab
和man 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