Ik heb een systemd service gemaakt die ik wil starten en stoppen als een specifieke usb camera wordt ingeplugd of losgemaakt. Deze job werkt goed als ik hem start en stop met systemctl start|stop <service>.
Als udev de webcam detecteert probeert udev de systemd service te starten maar die exit met code 1 zonder zijn werk te doen. Ik kom er niet achter waarom.
Achtergrond:
Dit gaat om een oude Trust Spacecam 320 webcam met ov519 chip die alleen jpg plaatjes uitspuugt. Veel software kan hier niet mee werken. Ik gebruik gstreamer om de camera uit te lezen en de jpegs te converteren naar een gewone videostream. Deze stream kan wel worden gebruikt.
Mijn systemd service:
En mijn udev rules file:
Als ik de camera inplug wordt de v4l2loopback niet geladen en de streamer pijplijn wordt niet gestart. In mijn syslog zie ik:
De output van systemctl status webcam-ov519 is:
Het lijkt er dus op dat de service wordt gestart maar meteen beeindigd.
Punten waarvan ik vermoed waar het aan zou kunnen liggen:
Heeft iemand een idee hoe ik meer info over de reden van de exitcode kan krijgen?
Als udev de webcam detecteert probeert udev de systemd service te starten maar die exit met code 1 zonder zijn werk te doen. Ik kom er niet achter waarom.
Achtergrond:
Dit gaat om een oude Trust Spacecam 320 webcam met ov519 chip die alleen jpg plaatjes uitspuugt. Veel software kan hier niet mee werken. Ik gebruik gstreamer om de camera uit te lezen en de jpegs te converteren naar een gewone videostream. Deze stream kan wel worden gebruikt.
Mijn systemd service:
[Unit] Description=OV519 webcam [Service] Type=simple ExecStartPre=modprobe v4l2loopback video_nr=1 card_label="Virtual raw camera" ExecStart=gst-launch-1.0 v4l2src device=/dev/video0 ! jpegdec ! videoconvert ! v4l2sink device=/dev/video1 ExecStopPost=modprobe -r v4l2loopback
En mijn udev rules file:
ACTION=="add", \ SUBSYSTEM=="video4linux", \ ATTRS{idVendor}=="05a9", \ ATTRS{idProduct}=="8519", \ RUN+="systemctl start webcam-ov519" ACTION=="remove", \ SUBSYSTEM=="video4linux", \ ATTRS{idVendor}=="05a9", \ ATTRS{idProduct}=="8519", \ RUN+="systemctl stop webcam-ov519"
Als ik de camera inplug wordt de v4l2loopback niet geladen en de streamer pijplijn wordt niet gestart. In mijn syslog zie ik:
jan 16 19:56:24 Desktop kernel: usb 6-5: new full-speed USB device number 16 using ohci-pci jan 16 19:56:25 Desktop kernel: usb 6-5: New USB device found, idVendor=05a9, idProduct=8519, bcdDevice= 1.00 jan 16 19:56:25 Desktop kernel: usb 6-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0 jan 16 19:56:25 Desktop kernel: usb 6-5: Product: USB Camera jan 16 19:56:25 Desktop kernel: usb 6-5: Manufacturer: OmniVision Technologies, Inc. jan 16 19:56:25 Desktop kernel: gspca_main: ov519-2.14.0 probing 05a9:8519 jan 16 19:56:25 Desktop kernel: input: ov519 as /devices/pci0000:00/0000:00:13.0/usb6/6-5/input/input47 jan 16 19:56:25 Desktop mtp-probe[10440]: checking bus 6, device 16: "/sys/devices/pci0000:00/0000:00:13.0/usb6/6-5" jan 16 19:56:25 Desktop mtp-probe[10440]: bus: 6, device: 16 was not an MTP device [b]jan 16 19:56:25 Desktop systemd-udevd[10437]: Process 'systemctl start webcam-ov519' failed with exit code 1.[/b]
De output van systemctl status webcam-ov519 is:
webcam-ov519.service - OV519 webcam Loaded: loaded (/etc/systemd/system/webcam-ov519.service; static; vendor preset: enabled) Active: inactive (dead) jan 16 13:49:40 Desktop systemd[1]: Starting OV519 webcam... jan 16 13:49:40 Desktop systemd[1]: Started OV519 webcam. jan 16 13:49:41 Desktop gst-launch-1.0[4488]: Pijplijn gezet op gepauzeerd ... jan 16 13:49:41 Desktop gst-launch-1.0[4488]: Pijplijn klaar en heeft PREROLL niet nodig... jan 16 13:49:41 Desktop gst-launch-1.0[4488]: Pijplijn gezet op afspelen ... jan 16 13:49:41 Desktop gst-launch-1.0[4488]: New clock: GstSystemClock jan 16 13:49:57 Desktop systemd[1]: Stopping OV519 webcam... jan 16 13:49:57 Desktop systemd[1]: webcam-ov519.service: Main process exited, code=killed, status=15/TERM jan 16 13:49:57 Desktop systemd[1]: webcam-ov519.service: Succeeded. jan 16 13:49:57 Desktop systemd[1]: Stopped OV519 webcam.
Het lijkt er dus op dat de service wordt gestart maar meteen beeindigd.
Punten waarvan ik vermoed waar het aan zou kunnen liggen:
- Het gst-launcher commando blijft draaien, normaal gesproken op de voorgrond, maar systemd zorgt dat hij naar de achtergond verdwijnt.
- Het type van de systemd service. Op basis van de Arch wiki denk ik dat simple het goede type is. De anderen lijken me niet van toepassing.
- De manier waarom ik met udev de systemd service wil starten. Ik heb ook ergens een andere, heel ingewikkelde, methode gezien. Sinds udev en systemd samengevoegd zijn zou dit toch triviaal moeten zijn.
- er worden remove events gecreerd. Kan het zijn dat een van de andere devices op de webcam (de luidspreker of de knop) deze genereert en dat udev gebruikt om de service te stoppen. Maar dat zou niet moeten omdat ik in mijn udev regels specifiek het video4linux subsysteem heb gespecificeerd.
Heeft iemand een idee hoe ik meer info over de reden van de exitcode kan krijgen?