我们有一个由 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\nRun Code Online (Sandbox Code Playgroud)\n\n我注意到它有 0 个任务,因此我手动重新启动它。现在已经正常运行了。我怀疑是我之前提到的问题造成的。
\n\n问题是,如果以后出现此类问题,如何让systemd重生进程呢?
\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\nRun Code Online (Sandbox Code Playgroud)\n\n更新:有关我的脚本的一些解释
\n\n的主要功能ImportantScript是如果给定(arg)目录中发生某些事件,则进入永远循环以执行某些操作。我应该能够为不同的目录启动多个实例。在启动脚本之前,我必须添加一组实例规范,例如:
ImportantScript add --name XYZ --dir /path/to/dir ..etc..\nRun Code Online (Sandbox Code Playgroud)\n\n现在,我可以启动XYZ.
每次我启动一个实例时,它都会将 PID 存储到包含所有预定义实例的文件中(使用之前的add命令)。未列出的 PID 表示相应实例处于空闲状态。
要停止实例,我只需调用ImportantScript stop --instance name. 它将终止进程并删除文件中相应的条目,清理其混乱。
我希望这不是一个 systemd 恐怖屋条目。
\n如果您希望 systemd 重新启动您的服务,您需要Restart=service 选项。您的服务可能会自行退出,如Active: active (exited)systemctl 输出所示,并且它的退出代码为 0。
如 中所述,一些最常见的可能配置man systemd.service是:
Restart=always:除非服务被显式停止(例如systemctl stop,或直接StopUnit通过 DBus 调用),否则重新启动它。Restart=on-failure:如果服务因 >0 退出代码而终止,请重新启动它。Restart=no:默认。不要重新启动服务。这些可能是最常用的设置 - 您可以在上面链接的表中找到更多选项。