Systemd 不会重生进程

ann*_*hri 2 linux systemd

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

\n\n

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

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

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

\n\n

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

\n\n
\n\n

这是 .service 文件:

\n\n
[Unit]\nDescription= Important daemon\n\n[Service]\nType=oneshot\nExecStart=/usr/local/bin/importantScript start --instance XYZ\nRemainAfterExit=true\nExecStop=/usr/local/bin/importantScript stop --instance XYZ\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n

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

\n\n
ImportantScript add --name XYZ --dir /path/to/dir ..etc..\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,我可以启动XYZ.

\n\n

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

\n\n

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

\n\n

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

\n

Chr*_*own 5

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

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

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

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

  • 好吧,你不能两全其美。如果你希望 systemd 管理你的进程,你需要给它正确的进程来管理...... (2认同)