如何让systemd服务重启后自动运行?

如何让systemd服务重启后自动运行?

我很绝望。我正在用 Raspberry Pi 制作一个相机项目,我Raspbian Buster在那里运行,看在上帝的份上,我无法使用systemd.我可以很好地启动它们,但inactive (dead)重新启动后它们将始终存在。

我的单位在/home/pi/.config/systemd/user/.他们是:

camera-control.service

[Install]
WantedBy=multi-user.target

[Unit]
Description=Camera position controlling server

[Service]
ExecStart=python3 "${HOME}/scripts/start.camera_control.server.py"

和:

camera-stream.service

[Install]
WantedBy=multi-user.target

[Unit]
Description=Camera streaming

[Service]
ExecStart=bash "${HOME}/scripts/start.stream.sh"

python脚本基本上是用 运行TCPServer server.serve_forever(),bash脚本是这样的:

mkdir -p "${HOME}/storage"

raspivid --nopreview -ih -hf -vf --width 800 --height 600 --framerate 15 --bitrate 2000000 --profile main --timeout 0 -g 4 -o - | gst-launch-1.0 -v fdsrc do-timestamp=true ! h264parse ! tee name=t \
 t. ! queue ! rtph264pay config-interval=1 pt=96 ! udpsink host=dom.zaroda.pl port=8004 \
 t. ! queue ! splitmuxsink location="${HOME}/storage/%02d.mkv" max-size-time=30000000000 muxer=matroskamux

这两个服务都可以正确运行systemctl --user start camera-control。但它们永远不会在重启后运行。

现在我尝试了很多东西。随着我所做的每一次更改systemctl --user daemon-reload,我都会重新启用它们 - 我确保它们始终处于启用状态。

  • exec我尝试在 之前添加raspivid

  • 我尝试添加

这:

After=network-online.target

Unit章节。

和这个:

After=network.target

和这个:

Before=network-online.target

和这个:

Wants=network-online.target

我可以在互联网上找到所有配置。

我还尝试了所有这些,将服务类型设置为:forkingoneshot

我启用了systemd-networkd服务并向该Unit部分添加了以下内容:

After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service

以上所有的配置都有无数种。它就是行不通。每次我在启用这两个服务的情况下重新启动时,我都会得到与systemctl --user status camera-stream和相同的状态systemctl --user status camera-control

● camera-stream.service - Camera streaming
   Loaded: loaded (/home/pi/.config/systemd/user/camera-stream.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

● camera-control.service - Camera position controlling server
   Loaded: loaded (/home/pi/.config/systemd/user/camera-control.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

里面什么都没有journalctl

我一定错过了一些非常简单的事情。你有什么建议我还可以尝试让它发挥作用吗?我觉得我对上述可以想象到的设置的每一个配置都进行了暴力强制。

添加#1:

另一件事是,RPi 正在通过 wifi (wlan0) 连接到网络。它在这里可能重要也可能不重要。

添加#2:

当添加到服务/etc/systemd/system/并“全局”运行时,服务实际上会按预期工作。但当以用户身份运行时,它们拒绝启动,这就是我所追求的。

输出sudo loginctl show-user pi

UID=1000
GID=1000
Name=pi
Timestamp=Wed 2020-01-01 14:10:16 CET
TimestampMonotonic=8249110
RuntimePath=/run/user/1000
[email protected]
Slice=user-1000.slice
Display=c1
State=active
Sessions=c1
IdleHint=no
IdleSinceHint=1577884640207702
IdleSinceHintMonotonic=421820778
Linger=yes

答案1

其背后的原因是因为这是在用户下面运行的服务pi。如服务路径中所述:/home/pi/.config/systemd/。这只会触发服务启动登录。

为了使用户服务正常工作,您需要pi通过运行以下命令为用户启用 linger:

sudo loginctl enable-linger pi

有关更多信息,请参阅Loginctl 的手册页

另外,请注意,这multi-user.target不是用户服务的有效服务,您需要更改WantedBydefault.target,使其变为:

WantedBy=default.target

现在,该服务将在 pi 用户启动时启动,无需登录。

相关内容