Ddclient not working as a service (Rpi2 - OSMC alpha4)

It seems my ddclient is not anymore running as a service, no matter what I do.
I installed it using apt-get install ddclient and configured it in the same way like it was on raspbmc.
But the service is not starting, so if my router would reconnect obtaining a new ip from my ISP, my dyn dns service will not be notified by my pi.

My config looks like this: /etc/ddclient.conf

> # Configuration file for ddclient generated by debconf
> #
> # /etc/ddclient.conf

> protocol=dyndns2
> use=web, web=checkip.dyndns.com, web-skip='IP Address'
> server=dynupdate.no-ip.com
> login=xxxx
> password='xxxx'
> xxxx.info

/etc/init.d/ddclient:

#! /bin/sh
#
# init script for the dynamic DNS service update utility: ddclient

### BEGIN INIT INFO
# Provides:          ddclient
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Update dynamic domain name service entries
### END INIT INFO

# Author: Torsten Landschoff <torsten@debian.org>

PATH=/sbin:/bin:/usr/sbin:/usr/bin
NAME="ddclient"
DAEMON=/usr/sbin/$NAME
PERL=/usr/bin/perl
DESC="Dynamic DNS service update utility"

# Don't run if not installed
test -f $DAEMON || exit 0

# Evaluate the config for the Debian scripts
#run_daemon=false
#daemon_interval=300

if [ -r /etc/default/ddclient ]; then
  . /etc/default/ddclient
fi

PIDFILE=/var/run/$NAME.pid
OPTIONS="-daemon $daemon_interval -syslog -pid $PIDFILE"

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        if [ "$run_daemon" != "true" ]; then
                return 0
        fi

        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --test --start --quiet \
                --pidfile $PIDFILE --exec $PERL --startas $DAEMON \
                >/dev/null \
                || return 1

        start-stop-daemon --start \
                --pidfile $PIDFILE --exec $PERL --startas $DAEMON \
                -- $OPTIONS \
                || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        if [ "$run_daemon" != "true" ]; then
                return 0
        fi

        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --retry=TERM/30/KILL/5 \
                --pidfile $PIDFILE --exec $PERL
        return "$?"
}


case "$1" in
  start)
        if [ "$run_daemon" != "true" ]; then
                log_warning_msg "To run ddclient as a daemon, please set run_daemon to 'true' in /etc/default/ddclient "
                log_end_msg 0
                exit 0
        fi
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        if [ "$run_daemon" != "true" ]; then
                log_warning_msg "To run ddclient as a daemon, please set run_daemon to 'true' in /etc/default/ddclient "
                log_end_msg 0
                exit 0
        fi
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;

  status)
        echo -n "Status of $DESC: "
        if [ ! -r "$PIDFILE" ]; then
                echo "$NAME is not running."
                exit 3
        fi
        if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
                echo "$NAME is running."
                exit 0
        else
                echo "$NAME is not running but $PIDFILE exists."
                exit 1
        fi
        ;;


  restart|force-reload)
        if [ $run_daemon != "true" ]; then
                log_warning_msg "To run ddclient as a daemon, please set run_daemon to 'true' in /etc/default/ddclient "
                log_end_msg 0
                exit 0
        fi
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;

  *)
        N=/etc/init.d/$NAME
        # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
        log_success_msg "Usage: $N {start|stop|restart|force-reload}"
        exit 1
        ;;
esac

exit 0

If I run ddclient manually in terminal, it updates my ip and gives a successfully message.
but won’t update it automatically because is not able to run as a service.

if I try to start it I get this:

#/etc/init.d/ddclient start
[ ok ] Starting ddclient (via systemctl): ddclient.service.

if I’m checking the status of the service, I get this:

   #service ddclient status
â ddclient.service - LSB: Update dynamic domain name service entries
   Loaded: loaded (/etc/init.d/ddclient)
   Active: active (exited) since Thu 1970-01-01 00:00:07 UTC; 45 years 1 months ago

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

What can be the issue here ?

btw I run the update.rd ddclient defaults.

OSMC uses systemd not upstart like Raspbmc did.

So the whole way that services are loaded and managed has changed. There is some backward compatibility between systemd and sysvinit services but it is not 100%.

I’m not familiar with ddclient so can’t offer any specific advise to fix it but I can suggest a few things:

The proper systemd commands to start, stop, enable and disable services are:

sudo systemctl start name
sudo systemctl stop name
sudo systemctl enable name
sudo systemctl disable name

Where name is ddclient in your example. To check the status of a running service to see if it is running and any recent output you can use:

sudo systemctl status name

Running a script directly as /etc/init.d/ddclient start is unlikely to work properly.

You may want to read some of the documentation for systemd services to familiarise yourself with it, or contact the author to see if their package can be updated to be properly compatible with systemd if it is not.

Finally it could be that the service needs to wait for network before running, in which case you can run the following command:

sudo systemctl enable connman-wait-for-network

Which will configure OSMC to wait for the network to be up before launching services that need network access. For this to work you will need to make sure you update as this functionality was not added until after Alpha 4.

Thanks for the hints about systemd, this helped alot.
I managed to configure a ddclient to run as service with the following config:

  • created a file /etc/systemd/system/ddclient.service with the content:

    [Unit]
    Description=Dynamic DNS Client
    After=network.target

    [Service]
    Type=forking
    User=root
    Group=root
    UMask=002

    ExecStart=/usr/sbin/ddclient -daemon 300 -syslog

    Restart=Always
    TimeoutStopSec=300

    [Install]
    WantedBy=multi-user.target

The only drawback is that I don’t get any logs in syslog, cause that one doesn’t exist anymore.

btw in the same/similar way I managed to configure deluge and headphones.