我很绝望。我正在使用 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
这背后的原因是因为这是在用户之下运行的服务
pi
。如服务路径中所述:/home/pi/.config/systemd/
. 这只会在登录时触发服务。为了使用户服务正常工作,您需要
pi
通过运行以下命令为用户启用 linger:有关详细信息,请参阅loginctl 的手册页。
另外,请注意,这
multi-user.target
不是用户服务的有效服务,您需要更改WantedBy
为default.target
:现在该服务将在启动时为 pi 用户启动而无需登录。