我真的很疯狂地试图弄清楚为什么我的 systemd 服务不会在启动时启动,或者每当相关的 ruby 脚本失败时(就像我的意图应该做什么)。我在 EC2 Ubuntu 实例上运行它。
这是该服务的代码:
[Unit]
Description=Test
[Service]
User=ubuntu
Type=simple
ExecStart=/usr/bin/ruby /home/ubuntu/main/test.rb
Restart=on-failure
RestartSec=1s
[Install]
WantedBy=multi-user.target
我尝试更改目标、用户名或类型...什么也没有发生。该杂志没有给我任何具体信息。如果我启动该服务,它就会顺利运行。
但如果脚本失败,或者每当我杀死它来测试它时,它就会忽略重新启动的事情。
答案1
这听起来像是一个依赖性问题。
Systemd 正在运行,您的脚本需要预先运行 Ruby 才能执行。因此,在启动时,该服务可能会在 Ruby 加载/完成之前运行。这就是为什么您可以在盒子启动并运行后运行它。
查看在 [Unit] 'After=' 下添加 Ruby 环境的服务名称。(我不确定那会是什么。)
然后 Systemd 应该等待 Ruby 加载,然后再尝试加载服务。
查看您的 Ruby 脚本并了解它可能需要哪些依赖项。例如,可能需要预先启动并运行网络。在 [Unit] 下,您可以添加“After=”,然后添加所需的依赖项。
After=network.target
这就是为什么在盒子启动并运行后您可以启动服务,所需的依赖项已加载。