systemd 服务将手动启动,但不会在启动时启动?

Lil*_*ahn 6 arch-linux systemd

我已经编写了一个 systemd 服务来在我的 Raspberry Pi 上启动地面控制。

[Unit]
Description=Groundcontrol status monitor

[Service]
ExecStart=/opt/groundcontrol/groundcontrol/start.sh
Type=forking

[Install]
WantedBy=multi-user.target  
Run Code Online (Sandbox Code Playgroud)

我正在使用该脚本,因为除非从 bin 目录启动,否则地面控制将无法正常工作。这是脚本:

cd /opt/groundcontrol/groundcontrol
./groundcontrol &
Run Code Online (Sandbox Code Playgroud)

当我手动启动它时,这非常有效,但是当我启动我的 Pi 并运行systemctl它时,它说它失败了。systemctl status groundcontrol.service印刷

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: failed (Result: exit-code) since Wed 1969-12-31 17:00:14 MST; 43 years 11 months ago
  Process: 111 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 116 (code=exited, status=2)

Dec 31 17:00:11 waldo systemd[1]: Starting Groundcontrol status monitor...
Dec 31 17:00:12 waldo systemd[1]: Started Groundcontrol status monitor.
Dec 31 17:00:14 waldo systemd[1]: groundcontrol.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 31 17:00:14 waldo systemd[1]: Unit groundcontrol.service entered failed state. 
Run Code Online (Sandbox Code Playgroud)

当我手动运行它时,状态是

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: active (running) since Thu 2013-12-26 15:38:02 MST; 1s ago
  Process: 296 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 297 (groundcontrol)
   CGroup: /system.slice/groundcontrol.service
           `-297 ./groundcontrol

Dec 26 15:38:02 waldo systemd[1]: Started Groundcontrol status monitor. 
Run Code Online (Sandbox Code Playgroud)

有一个与地面控制一起提供的 System V init 脚本,但我不知道如何将它与 systemd 一起使用 - 这可能吗,它会比我的服务更好吗?如果没有,我该如何修复此服务?谢谢。

use*_*686 4

日志说:

\n\n
\n

main process exited, code=exited, status=2/INVALIDARGUMENT

\n
\n\n

这说明问题出在groundcontrol自己身上;它返回了状态 2(某种失败)。

\n\n

通常,此特定问题 \xe2\x80\x93 服务仅在启动时失败 \xe2\x80\x93 是由服务启动太早引起的,也就是说,当它需要某些系统尚未发现的硬件设备时。(请记住,在现代 Linux 系统上,几乎所有设备都是动态发现的;没有必要说“哦,我拥有所有设备,让我们开始 init。”)

\n\n

解决方案是重写程序以使用 libudev 并动态添加设备。

\n\n

解决方法是在特定设备之后订购服务(虽然我不知道它需要哪个设备,所以我无法给出完整的答案),或者使用 Wants= + After= 来拉入等待,systemd-udev-settle.service直到 udev 处理完第一批“新设备”活动。

\n\n
\n\n

另外,为什么你有一个完整的单独.sh脚本,其唯一目的是 cd 到目录?WorkingDirectory=+Type=simple就足够了。(这&也是不必要的,因为 systemd 本身 \xe2\x80\x93 是一个服务管理器 \xe2\x80\x93 在“后台”运行所有内容。)

\n