长话短说
如何产生来自旧 system-V 服务的“可编辑”systemd .service 文件?
最近,我们遇到了一个问题,我们的自制“服务器管理器”无法在“Ubuntu 16.04.1”服务器上启动服务,因为该服务处于“活动(退出)”状态,而不是“非活动”状态。谷歌搜索告诉我我可以将类似的内容添加到服务文件中:
Restart=always
RestartSec=3
但打电话“systemctl edit myservice”给我一个空文件。显然,systemd 基于“/etc/init.d/myservice”文件生成一些默认的 .service 文件。使用find,我发现“/run/systemd/generator.late/myservice.service”下有一个生成的文件。但它包含很多东西,可能是特定于这个“运行”的,比如“Before=”和“After=”,我不确定是否应该使用它作为基础。
我不想从头开始编写 .service 文件,因为我对 systemd .service 格式一无所知,而且这是一个正在运行的 24/7 高效服务器(没有测试服务器克隆,我可以用来“练习”)。
答案1
systemd-sysv-generator
您正在使用由 van Smoorenburg脚本生成的单元rc
,很可能带有 LSB 标头信息。 systemd-sysv-generator
采用一种一刀切的方法,并经过一些猜测进行修改。 van Smoorenburgrc
脚本可能会也可能不会启动长时间运行的守护进程,可能会也可能不会使用 PID 文件,等等。 systemd-sysv-generator
尝试生成适应这几种可能性的服务单元。
自动生成的服务单元是从带有 LSB 信息的RemainAfterExit=true
van Smoorenburg 脚本生成的。rc
因此,当执行脚本的进程退出并且没有留下任何正在运行的进程时,服务仍被视为“活动”,服务进程已退出。这是退出后剩下的方法。因此,服务进入该active (exited)
状态。
您应该停止使用/etc/init.d/myservice
并停止依赖systemd-sysv-generator
将其包装在随机数服务单元中。建立正规、一流的服务单位档案。
您可以从给您的那个开始systemctl edit --full myservice
。但清楚地设置不正确RemainAfterExit=true
,对于初学者。
当然,这也是一个很好的理由不是继续保持现状不是继续依赖自动生成的服务单元文件。
进一步阅读
答案2
我不确定是否值得保留这个问题,但我的误解使这个问题毫无意义。
我的错误是认为
systemctl edit myservice
实际上编辑了满的.service
文件(正如人们在没有先验知识的情况下根据命令名称所假设的那样),因此我必须先编写一个文件,然后才能使用此命令。这是解释的这里。基本上,
systemctl edit myservice
是为了压倒性的设置,这就是为什么默认为空。要编辑实际文件,您需要执行
systemctl edit --full myservice
.如果我在我的 system-V 服务上这样做,我确实会看到完整的生成的文件。