나는 필사적이다. 저는 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가 Wi-Fi(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 사용자가 부팅할 때 서비스가 시작되며 로그인이 필요하지 않습니다.