This is probably a more generic problem due to a coding style, but it happened to me with OpenSSH, so I'll put it in the record here. (just trying to start sshd when it's already running) # ./sshd -d [snip] socket: Invalid argument debug1: Bind to port 22 on 0.0.0.0. fatal: Cannot bind any address. # echo $? 255 # ./sshd # echo $? 0 With './sshd', the same fatal message is printed to syslog. --- Now, the init script e.g. does: --- action $"Starting $prog: " /usr/sbin/sshd RETVAL=$? --- now RETVAL is 0 (as above), even though sshd really fatal()'ed out with 255 exit code. Kevin Steves <stevesk.com> explained on openssh-univ-dev list: --- this one has forked and detached from the terminal at the point of that error. its parent does exit(0) in daemon() which is what the shell sees. --- So, it'd appear RETVAL or exit codes are not always too reliable. Luckily in this case it doesn't really matter that RETVAL is mistaken to be 0.
This is not a bug but rather a feature of the current SYS V init scripts style code. The RETVAL can reflect only errors before the daemonization happens. There is nothing we can do with that.