进一步阅读

进一步阅读

当进程崩溃或终止时,是否有任何命令/脚本可以自动写入以重新启动进程(在识别进程 ID 后)。

例如,我正在运行一个可执行的 bin 文件,并且希望每次崩溃或被杀死时自动重新启动。

答案1

扩展至伊普尔·瑟瑟关于使用的评论systemd

来自RHEL 7 文档

Systemd 是 Linux 操作系统的系统和服务管理器。它被设计为向后兼容 SysV 初始化脚本,并提供了许多功能,例如在引导时并行启动系统服务、按需激活守护进程、支持系统状态快照或基于依赖关系的服务控制逻辑。在 Red Hat Enterprise Linux 7 中,systemd 取代 Upstart 作为默认 init 系统。

基本上systemd将服务和系统作为一个整体进行管理。如果您希望一个进程始终运行,那么您希望它表现为服务。制作定制服务文件并不困难。

服务文件属于/etc/systemd/system/NAME.service 根据文档

自定义服务文件的示例RHEL 7 文档再次:

[Unit]
Description=service_description
After=network.target

[Service]
ExecStart=path_to_executable
Type=simple

[Install]
WantedBy=default.target

他们对该文件的作用的描述:

在哪里:

service_description 是信息性描述,显示在日志日志文件和 systemctl status 命令的输出中。

After 设置确保服务仅在网络运行后启动。添加其他相关服务或目标的空格分隔列表。

path_to_executable 代表实际服务可执行文件的路径。

...

WantedBy 指明服务应在其下启动的一个或多个目标。将这些目标视为旧的运行级别概念的替代,请参阅第 9.3 节“使用 systemd 目标”了解详细信息。

Type=simple是常态,并假设在 中启动的可执行文件ExecStart将保持运行。

回到最初的问题,如果你用来systemd将你的进程变成一个服务,你可以用它systemd来确保你的服务始终运行。

来自RHEL 7 文档再次:

另一个例子是一个配置文件,在主进程退出后重新启动服务,延迟 30 秒:

[Service]
Restart=always
RestartSec=30

如果您只是将Restart=always选项添加到服务文件的部分中,[Service]则服务应该在任何时候关闭/退出时重新启动,除非您使用 停止它systemd

答案2

丹·伯恩斯坦的守护进程工具旨在做到这一点,并开始了一系列共享相同原始机制的工具集:

在几乎所有这些中,人们编写一个run运行/作为守护进程的程序,服务管理器或主管进程只是使用正常的 Unix 和 Linux 机制将其作为分叉子进程进行监视。这可以通过以超级用户身份运行的专用服务管理器在系统范围内完成,也可以通过单独的服务管理器在每个用户上完成。

所有这些工具集都是连贯且自洽的,但请注意,它们都不要求人们使用除任何特定情况下所需的工具之外的任何工具。也可以混合搭配。人们可以使用 Laurent Bercot 的execlineb及其在 perp 下的所有实用程序,或者我的nosh脚本解释器及其在 runit 下的所有实用程序;就像人们可以chpst在我的service-manager.

同样,您可以使用从 systemd 运行的系统范围或每用户服务。 systemd 单元文件与脚本具有相同的简单性run,尽管它们不是强制性的,但它们不提供对如何设置服务进程的执行状态的细粒度精确控制。当然是2017年了迁移到 systemd 的第一条规则适用。

所有这些都提供了在引导程序中启动守护进程、在系统运行时在管理员/自动控制下停止和启动守护进程以及在各种故障情况下自动重新启动守护进程的基本基础。

进一步阅读

相关内容