当我们创建并启动一个系统服务运行时,要运行一个脚本,如果我们包含重新启动=始终在.service文件中,这是否意味着它再次执行执行启动脚本完成后并因此继续循环执行脚本?
我正在查看项目中的服务文件(如下所示),并试图准确了解此处发生的情况。 app_script.sh start 是连续调用还是仅在系统服务停止时调用?我对此很困惑。
[Unit]
Description=application script
ConditionPathExists=/application
After=network.target app.service data.service
[Service]
Type=simple
ExecStart=/application/app_script.sh start
ExecStop=/application/app_script.sh stop
#RemainAfterExit=yes
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
答案1
如果我们在 .service 文件中包含 Restart=always,这是否意味着它会在脚本完成后再次执行 ExecStart,从而继续循环执行脚本?
Restart
仅当启动的进程退出时才会调用该选项;与always
, 根据systemd.service 文档,如果进程由于以下原因退出,服务将重新启动:
- 清除退出代码或信号
- 不干净的退出代码
- 信号不干净
- 暂停
- 看门狗
该文档继续说道:
作为上述设置的例外情况,如果在 RestartPreventExitStatus= 中指定退出代码或信号(见下文),或者使用 systemctl stop 或等效操作停止服务,则不会重新启动服务。此外,如果在 RestartForceExitStatus= 中指定了退出代码或信号,服务将始终重新启动(见下文)。
由于您没有配置 RestartForceExitStatus 也没有配置 RestartPreventExitStatus,因此该进程只会在systemctl stop
(“或等效操作”)期间被 systemd 停止。
app_script.sh start 是连续调用还是仅在系统服务停止时调用?
就目前而言,两者都不是。如上所述,它不会被连续调用。如果服务停止(当然,除了调用/application/app_script.sh stop
);仅当过程由服务停止启动。
请注意,Type=simple
服务指示 systemd 将ExecStart
参数视为实际服务。您的命名约定/application/app_script.sh start
意味着涉及一个 shell 脚本,该脚本可能会调用一个或多个其他脚本或二进制文件。如果您的 shell 脚本分叉了该进程并自行退出,systemd 将认为您的服务进程已退出。