如何编写 bash 脚本以在进程冻结时重新启动进程

小夏 科技 更新 2024-02-29

问:

我有一个 python 脚本,它将检查队列并对每个元素执行操作:

# checkqueue.py

while true:

check_queue()

do_something()

如何编写 bash 脚本来检查它是否正在运行,如果没有,请启动它。 大致如下:伪**(或者它应该做类似 ps |。grep的事情? )

# keepalivescript.sh

if processidfile exists:

if processid is running:

exit, all ok

run checkqueue.py

write processid to processidfile

我将从 crontab 调用它
# crontab

5 * /path/to/keepalivescript.sh

一个:避免使用 pid 文件、cron 或任何其他试图评估不属于其子进程的进程。

在 Unix 中,等待子进程是有充分理由的。 任何试图解决这个问题的方法(ps 解析、pgrep、存储 pid 等)都是有缺陷的,并且存在漏洞。 稍后分析。

假设您的进程名为 proca,进程监控名为 procb,您需要 procb 作为 proca 的父进程。 因为只有启动流程的流程才能可靠地等待它结束。 这在 bash 中很容易实现。

until proca; do

echo "proca crashed with exit code $?restart..." >&2

sleep 1

done

上面的 bash 在 until 循环中运行 proca。 第一行开始 proca 并等待它结束。 当它结束时,直到检查其退出状态。 如果退出状态为 0,则表示它正常结束(这意味着您要求它以某种方式关闭,并且它成功关闭)。 在这种情况下,我们不想重新启动它(我们只是要求它关闭! 如果退出状态不是 0,则循环体将运行,这会在 stderr 上发出错误消息,并在 1 秒后重新启动循环(返回第 1 行)。

我们为什么要等一会儿? 因为如果 Proca 的启动顺序出现问题并立即崩溃,您将获得一个非常密集的不断重启和崩溃的循环。 睡眠 1 消除了这种压力。

然后需要做的就是启动这个 bash 脚本,它将监控 proca 并在必要时重新启动它。 如果你想在引导时启动监控脚本(操作系统),你可以用@reboot规则在用户的 cron(1) 中调度它。 使用 crontab -e 命令打开 cron 规则并添加规则以启动监视脚本:

@reboot /usr/local/bin/procamonitor

至于不使用pid文件的原因:

1.PID 重用(这可能导致杀死错误的进程)。

2.PID 文件已过时。 您需要过于复杂的逻辑来检查 pid 文件是否过时,并且任何此类逻辑在 1 中都存在相同的缺陷。

3.如果您甚至没有写入权限或处于只读环境中,该怎么办?

或者,查看 systemdunit(5)。您可以将名为 proca. 的文件添加到 lib systemd 系统目录服务,让 systemd 进程监控您的 proca。

[unit]

description=daemon for proca.

service]

execstart=/path/to/proca

restart=on-failure

restartsec=1s

install]

wantedby=multi-user.target

然后执行以下命令:
systemctl daemon-reload

systemctl enable proca.service

参考:stackoverflow 问题 696839

man systemd.unit

man systemctl

相关阅读:SH 和 Bash 的区别。

2>&1 在 shell 中是什么意思。

在 bash 中,是否更推荐使用双括号而不是单方括号。

如何检查是否在 bash 中设置了变量。

相似文章

    Python 脚本提示:如何编写有效的命令行工具

    帮助计划 介绍 嗨,python编程的家伙们!今天我们要讲一个实用的话题 如何编写一个有效的python命令行工具。您是否曾经有过快速处理某些数据或自动执行某些任务的经验,但不知道从哪里开始?别担心,其余内容将为您揭开 Python 脚本的神秘面纱。首先,我们需要明确自己的需求。一个好的命令行工具应...

    如何在Python中高效编写代码?Python实用编程技巧分享!

    Python 是一种高效 易学且功能强大的编程语言,具有许多实用的编程技巧,可以帮助开发人员更高效地编写。以下是一些实用的 Python 编程技巧的细分和示例 .列表推导式 列表推理是一种在 Python 中创建和操作列表的简洁 易于阅读的方法。它可以使 更简洁,减少冗余。例如,将列表中的所有元素平...

    古代家谱是如何写成的

    家谱是一本记载家族成员的历史书,充满神秘感,让我们来探究一下古代家谱是如何写成的。在古代,家谱一般由家族长辈或专门修改家谱的人撰写。他们会首先收集家庭成员的信息,包括姓名 生卒日期 成就 事迹等,然后将它们汇编成册。在组织过程中,他们也会根据家族的传承和历史,添加一些特殊的符号和标记,以突出家族的历...

    如何用巧妙的押韵写一首山歌

    大家好,今天想和大家分享一种美妙而独特的民间艺术形式 创作山歌。这种古老的艺术形式,就像民间艺术中的杂技一样,既需要技巧,也需要情感投入。让我们仔细看看它的魅力吧!首先,让我们谈谈押韵。韵律是山歌中不可缺少的一部分,它使每一句话的最后一个字和谐地回响,形成鲜明的节奏感。押韵主要有三种方式 单句押韵,...

    如何写家谱是正确的?

    家谱是记载家族历史 传承家族文化的重要文献,一本线条清晰 内容正确的家谱,对家族的凝聚和传承具有重要意义。那么,如何才能写出好的家谱呢?.确定写作目的。在你开始写你的家谱之前,你必须首先明确写作的目的。是记录家族史,传承家族文化,还是纪念家族成员,彰显家族荣耀等。明确写作目的有助于确定家谱的内容和风...