다시 시작한 후 시스템 서비스를 자동으로 실행하는 방법은 무엇입니까?

다시 시작한 후 시스템 서비스를 자동으로 실행하는 방법은 무엇입니까?

나는 필사적이다. 저는 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-networkdUnit다음을 추가했습니다 .

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

관련 정보