Systemd 不会重生进程

Systemd 不会重生进程

我们有一个由 systemd 处理的永久运行的 shell 脚本,它运行良好,直到几天前,由于一些巨大的日志文件,我们的服务器存储已 100% 使用。我必须截断这些文件才能释放一些空间。

今天,我收到报告称该脚本已停止运行。但当我检查状态时,它说:

● ImportantService.service - Important daemon
   Loaded: loaded (/etc/systemd/system/ImportantService.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2020-04-29 16:46:48 WIB; 5 days ago
  Process: 48877 ExecStop=/usr/local/bin/importantScript stop --instance XYZ (code=exited, status=0/SUCCESS)
  Process: 48889 ExecStart=/usr/local/bin/importantScript start --instance XYZ (code=exited, status=0/SUCCESS)
 Main PID: 48889 (code=exited, status=0/SUCCESS)
    Tasks: 0
   Memory: 48.0K
   CGroup: /system.slice/ImportantService.service

我注意到它有 0 个任务,因此我手动重新启动它。现在已经正常运行了。我怀疑是我之前提到的问题造成的。

问题是,如果以后出现此类问题,如何让systemd重生进程呢?


这是 .service 文件:

[Unit]
Description= Important daemon

[Service]
Type=oneshot
ExecStart=/usr/local/bin/importantScript start --instance XYZ
RemainAfterExit=true
ExecStop=/usr/local/bin/importantScript stop --instance XYZ

[Install]
WantedBy=multi-user.target

更新:关于我的脚本的一些解释

的主要功能ImportantScript是如果给定(arg)目录中发生某些事件,则进入永远循环以执行某些操作。我应该能够为不同的目录启动多个实例。在启动脚本之前,我必须添加一组实例规范,例如:

ImportantScript add --name XYZ --dir /path/to/dir ..etc..

现在,我可以启动XYZ.

每次我启动一个实例时,它都会将 PID 存储到包含所有预定义实例的文件中(使用之前的add命令)。未列出的 PID 表示相应实例处于空闲状态。

要停止实例,我只需调用ImportantScript stop --instance name.它将终止进程并删除文件中相应的条目,清理其混乱。

我希望这不是一个 systemd 恐怖屋条目。

答案1

如果您希望 systemd 重新启动您的服务,您需要Restart=service 选项。您的服务可能会自行退出,如Active: active (exited)systemctl 输出所示,并且它的退出代码为 0。

一些最常见的可能配置,如中所述man systemd.service, 是:

  • Restart=always:除非服务被显式停止(例如systemctl stop,或直接StopUnit通过 DBus 调用),否则重新启动它。
  • Restart=on-failure:如果服务因 >0 退出代码而终止,请重新启动它。
  • Restart=no:默认。不要重新启动服务。

这些可能是最常用的设置 - 您可以在上面链接的表中找到更多选项。

相关内容