NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

(solved) Re: rc.local nightmare





On 10/30/23 07:50, RVP wrote:
On Sun, 29 Oct 2023, Ramiro Aceves wrote:

if [ -x /root/nettest ]; then
    /root/nettest &
fi



Many thanks RVP for the superb explanation. It works fine now. If I had had to guess it myself, I think I would never have discovered it.

Many thanks!
Ramiro.




Redirect the output of your script somewhere and then it shoould be OK:

```
if [ -x /root/nettest ]; then
     /root/nettest >/root/nettest.log 2>&1 &
fi
```

(Or, use logger(1) on all output within the script.)

What's happening here can be understood if you look at the 2nd last
line of /etc/rc which is:

```
rc_real_work "$@" 2>&1 | rc_postprocess
```

The rc_real_work() function runs all the rc scripts in /etc/rc.d/
including /etc/rc.local (via /etc/rc.d/local), and _all_ output is,
as you can see, piped to rc_postprocess()

When all the scripts finish, /etc/rc exits, and so does the RHS of
that pipeline ie. whatever's running rc_postprocess(). So, anything
started by rc_real_work() will get a SIGPIPE as soon as it tries
to write stuff to its stdout/stderr.

The nohup command also didn't work for the same reason. The nohup
man-page says:

     If the standard output is a terminal, the standard output
     is appended to the file nohup.out in the current directory.
     If standard error is a terminal, it is directed to the same
     place as the standard output.

Well, here the output of _all_ the scripts is a pipe, so nohup
doesn't redirect the output of your command into a nohup.out file
and here too it gets a SIGPIPE.

HTH,

-RVP


Home | Main Index | Thread Index | Old Index