0

I'm debugging lirc on a Pi 3b running Stretch with 4.19 kernel.

In my previous question, I found a way to cause lircd to function, but it requires invoking the daemon with passed parameters.

I need to start lircd like this:

sudo lircd --device /dev/lirc0

Now I want to cause the Pi to boot with lirc in a usable state, using those required parameters in init.d.

The "start-stop-daemon" section of the file "lircd" in /etc/init.d looks like this:

        start-stop-daemon --start --quiet --oknodo \
                --exec /usr/sbin/lircd -- < /dev/null

When the Pi boots, lircd is already running, so to allow irsend to function I have to issue these commands to kill and restart with the required parameters:

sudo pkill -SIGTERM  lircd
sudo lircd --device /dev/lirc0

The Man page for start-stop-daemon --start says:

"Any arguments given after -- on the command line are passed unmodified to the program being started."

I edited the "start-stop-daemon" line of the "start" case section in the file "lircd" in /etc/init.d to this:

        start-stop-daemon --start --quiet --oknodo \
                --exec /usr/sbin/lircd  -- --device /dev/lirc0 < /dev/null

Based on the Man page for start-stop-daemon, I'm interpreting this command in its unmodified state as passing "< /dev/null" to lircd when it is run. That is the string that is after "--".

My expectation is that after my edit, the string "--device /dev/lirc0 < /dev/null" will be passed as parameters to /usr/sbin/lircd when it is run.

However, it does not work. irsend does not function at startup, until the kill and re-run commands are given. I'm assuming the parameters are not passed to lircd, but I'm not sure why.

I am not sure why the original parameters after "--" redirect /dev/null to stdin. Why is that needed? Maybe that is sending my added parameters to /dev/null too? What would be the proper syntax to pass the required parameters?

Ingo
  • 40,606
  • 15
  • 76
  • 189
tim11g
  • 257
  • 3
  • 11

2 Answers2

2

The IO redirection is not a argument. You can see that with a script:

#!/bin/bash
i=0
while [ "$1" != "" ] ; do
    i=$((i+1))
    echo "$i:  $1"
    shift
done

If you execute this with ./script a b </dev/null, the output will be

a
b

So the shell that executes the script does the IO redirection for start-stop-daemon.

If you put quotes around the </dev/null, it will be passed as a argument. But then, start-stop-daemon will also pass it to lircd as a argument and not as an IO redirection.

The question is: why do you need a </dev/null when you start-up lircd? I have never needed to do that.

Ljm Dullaart
  • 2,301
  • 7
  • 13
1

You are using Raspbian Stretch that already comes with systemd that replaces the old style SysV init system, managed with files in /etc/init.d/. This is deprecated since years and only emulated by systemd to ensure limited downstream compatibility. Have a look at Compatibility with SysV.

That you run into problems with sophisticated modifications of init scripts is not a surprise. You should really consider to use Unit files from systemd to manage services. If you really want to continue with init scripts then you should look at man systemd-sysv-generator what it does with your init scripts and why it doesn't work as expected.

Ingo
  • 40,606
  • 15
  • 76
  • 189