如何生成“默认”systemd .service 文件?

Seb*_*iot 3 systemd services

TL; 博士

如何从旧的 system-V 服务生成“可编辑”的 systemd .service 文件?

最近,我们遇到了一个问题,我们的本土“服务器管理器”无法在“Ubuntu 16.04.1”服务器上启动服务,因为所述服务处于“活动(退出)”状态,而不是“非活动”状态。谷歌搜索告诉我我可以在服务文件中添加这样的内容:

Restart=always
RestartSec=3
Run Code Online (Sandbox Code Playgroud)

但是调用“systemctl edit myservice”会得到一个空文件。显然,systemd 会根据“/etc/init.d/myservice”文件生成一些默认的 .service 文件。使用find,我发现在“/run/systemd/generator.late/myservice.service”下有一个生成的文件。但它包含很多内容,可能是特定于这次“运行”的内容,例如“Before=”和“After=”,我不确定是否应该将其用作基础。

我不想从头开始编写 .service 文件,因为我对 systemd .service 格式一无所知,而且这是一个 24/7 全天候运行的高效服务器(没有我可以用来“练习”的测试服务器克隆)。

Seb*_*iot 5

我不确定是否值得保留这个问题,但我的误解使这个问题毫无意义。

  • 我的错误是认为systemctl edit myservice实际上编辑了整个 .service文件(正如人们所假设的,在没有先验知识的情况下,基于命令名称),因此我必须先编写一个,然后才能使用此命令。这是解释here

  • 基本上,systemctl edit myservice用于覆盖设置,这就是默认情况下它为空的原因。

  • 要编辑实际文件,请执行systemctl edit --full myservice. 如果我在我的 system-V 服务上这样做,我会看到完整的生成文件。


Jde*_*eBP 5

systemd-sysv-generator您正在使用由 van Smoorenburg脚本生成的单元rc,很可能带有 LSB 标头信息。 systemd-sysv-generator采用一种一刀切的方法,并经过一些猜测进行修改。van Smoorenburgrc脚本可能会也可能不会启动长时间运行的守护进程,可能会也可能不会使用 PID 文件,等等。 systemd-sysv-generator尝试生成适应这几种可能性的服务单元。

自动生成的服务单元是RemainAfterExit=true从带有 LSB 信息的 van Smoorenburg 脚本生成的rc。因此,当执行脚本的进程退出并且没有留下任何正在运行的进程时,服务仍被视为“活动”,服务进程已退出。这就是退出后剩余的意思。因此,服务进入该active (exited)状态。

您应该停止使用/etc/init.d/myservice并停止依赖systemd-sysv-generator将其包装在随机数服务单元中。建立正规、一流的服务单位档案。

您可以从给您的那个开始systemctl edit --full myservice。但对于初学者来说,显然这是一个不正确的RemainAfterExit=true设置。

当然,这也是继续这样做并且继续依赖自动生成的服务单元文件的一个很好的理由。

进一步阅读