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

dhcp restart with bad config



Bonno Bloksma:

There is the strange fact that it seems the config is tested twice but I guess systemd will try to start a service twice before giving up.

I recommend less guessing and more reading your own posts.  (-:  You yourself posted the very script fragment where the script itself runs the test command twice:

test_config()
{
        if ! /usr/sbin/dhcpd -t $OPTIONS -q -cf "$DHCPD_CONF" > /dev/null 2>&1; then
                echo "dhcpd self-test failed. Please fix $DHCPD_CONF."
                echo "The error was: "
                /usr/sbin/dhcpd -t $OPTIONS -cf "$DHCPD_CONF"
                exit 1
        fi
}

See where that runs /usr/sbin/dhcpd in test mode twice?  The first time, dhcpd writes the error message to the syslog; the second time dhcpd writes the error message to its standard error.  Both lots of output end up in the journal.

From the LSB: prefix to the service name in the very log output that you posted, we can deduce that systemd is running your van Smoorenburg rc script as a service, wrapping it in a nonce service unit.  The test performed by the van Smoorenburg rc script is considered to be a part of your service.  By the time that the script is running, and executing the startup test, systemd thinks that your service is already running.  The stop and start actions of systemd encompass the script as a whole, and operate outwith the configuration validation test, not within it.

Put another way: There is no customizable mechanism to make the very execution of the start, stop, and restart commands in systemd dependent from first testing some arbitrary service-specific condition.  There's no way to tell systemd "only actually execute the restart command at all if this shell script first returns true".  When running restart, systemd will stop your service, start it again, and the test in the script will only then run as part of your service's initialization.

The best that you have are mechanisms that cause a startup to abort, by failing an ExecStartPre command.  But for those you must actually write a proper service unit file.  systemd-sysv-generator employs a one-size-fits-all approach, and will not generate such service-specific special-case stuff in the nonce units that it generates for van Smoorenburg rc scripts.  You need a bona fide human being to actually write a service unit file.  Even then, that is not enough.  A restart will still stop the service before the ExecStartPre tests are run, and you won't get what you want.  restart is stop then start.


Reply to: