我很绝望。我正在用 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
我可以在互联网上找到所有配置。
我还尝试了所有这些,将服务类型设置为:forking
和oneshot
。
我启用了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
不是用户服务的有效服务,您需要更改WantedBy
为default.target
,使其变为:
WantedBy=default.target
现在,该服务将在 pi 用户启动时启动,无需登录。