我们有一个由 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
:默认。不要重新启动服务。
这些可能是最常用的设置 - 您可以在上面链接的表中找到更多选项。