• [^] # Re: Devuan

    Posté par . En réponse au journal Remède au problème démarrage devuan ascii sur raspberry pi 2. Évalué à 8.

    rc.d se contente de lancer les daemons dans un ordre précis, défini par le nom du fichier.
    Ce qui veut dire (si je ne me trompe pas):

    • pas de gestion des dépendances (par example, sur ma Debian, ssh ne vérifie pas que le réseau est accessible);
    • démarrage des daemon en série, ce qui freine le démarrage du système (debian à bien un paquet starpar, mais il a beau être installé, si jamais je n'ai pas de DHCP le boot mets 3 plombes juste à cause de ça...);
    • si un daemon tombe, il n'est pas relancé automatiquement;
    • c'est une question de goût, mais, sérieux, 108 lignes de bourne shell pour gérer mpd (c'est un example, et je n'inclue pas les fichiers inclus)?
    • double fork: les process doivent s'échapper sinon le démarrage est bloqué...

    La plupart des distros ont opté pour systemd, personnellement je préfère runit (malgré que gérer les inter-dépendances soit pénible, il faut que je teste nosh pour ça).

    Pour info, avec rc.d, le script Debian pour lancer isc-dhcp-server (non, ce n'est pas le pire, juste 1 au hasard):

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: isc-dhcp-server
    # Required-Start: $remote_fs $network $syslog
    # Required-Stop: $remote_fs $network $syslog
    # Should-Start: $local_fs slapd $named
    # Should-Stop: $local_fs slapd
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: DHCP server
    # Description: Dynamic Host Configuration Protocol Server
    ### END INIT INFO
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    test -f /usr/sbin/dhcpd || exit 0
    DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp-server}"
    # It is not safe to start if we don't have a default configuration...
    if [ ! -f "$DHCPD_DEFAULT" ]; then
     echo "$DHCPD_DEFAULT does not exist! - Aborting..."
     if [ "$DHCPD_DEFAULT" = "/etc/default/isc-dhcp-server" ]; then
     echo "Run 'dpkg-reconfigure isc-dhcp-server' to fix the problem."
     fi
     exit 0
    fi
    . /lib/lsb/init-functions
    # Read init script configuration
    [ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT"
    NAME4=dhcpd
    NAME6=dhcpd6
    DESC4="ISC DHCPv4 server"
    DESC6="ISC DHCPv6 server"
    # use already specified config file or fallback to defaults
    DHCPDv4_CONF=${DHCPDv4_CONF:-/etc/dhcp/dhcpd.conf}
    DHCPDv6_CONF=${DHCPDv6_CONF:-/etc/dhcp/dhcpd6.conf}
    # try to read pid file name from config file or fallback to defaults
    if [ -z "$DHCPDv4_PID" ]; then
     DHCPDv4_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"\(.*\)"[ \t]*;.*$/1円/p' < "$DHCPDv4_CONF" 2>/dev/null | head -n 1)
    fi
    if [ -z "$DHCPDv6_PID" ]; then
     DHCPDv6_PID=$(sed -n -e 's/^[ \t]*dhcpv6-pid-file-name[ \t]*"\(.*\)"[ \t]*;.*$/1円/p' < "$DHCPDv6_CONF" 2>/dev/null | head -n 1)
    fi
    DHCPDv4_PID="${DHCPDv4_PID:-/var/run/dhcpd.pid}"
    DHCPDv6_PID="${DHCPDv6_PID:-/var/run/dhcpd6.pid}"
    test_config()
    {
     VERSION="1ドル"
     CONF="2ドル"
     if ! /usr/sbin/dhcpd -t $VERSION -q -cf "$CONF" > /dev/null 2>&1; then
     echo "dhcpd self-test failed. Please fix $CONF."
     echo "The error was: "
     /usr/sbin/dhcpd -t $VERSION -cf "$CONF"
     exit 1
     fi
    }
    check_status()
    {
     OPTION="1ドル"
     PIDFILE="2ドル"
     NAME="3ドル"
     if [ ! -r "$PIDFILE" ]; then
     test "$OPTION" != -v || echo "$NAME is not running."
     return 3
     fi
     if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
     test "$OPTION" != -v || echo "$NAME is running."
     return 0
     else
     test "$OPTION" != -v || echo "$NAME is not running but $PIDFILE exists."
     return 1
     fi
    }
    start_daemon()
    {
     VERSION="1ドル"
     CONF="2ドル"
     NAME="3ドル"
     PIDFILE="4ドル"
     DESC="5ドル"
     shift 5
     INTERFACES="$*"
     test_config "$VERSION" "$CONF"
     log_daemon_msg "Starting $DESC" "$NAME"
     if [ -e "$PIDFILE" ]; then
     log_failure_msg "dhcpd service already running (pid file $PIDFILE currenty exists)"
     exit 1
     fi
     touch /var/lib/dhcp/$NAME.leases
     start-stop-daemon --start --quiet --pidfile $PIDFILE \
     --exec /usr/sbin/dhcpd -- $VERSION -q -cf $CONF $INTERFACES
     sleep 2
     if check_status -q $PIDFILE $NAME; then
     log_end_msg 0
     else
     log_failure_msg "check syslog for diagnostics."
     log_end_msg 1
     exit 1
     fi
    }
    stop_daemon()
    {
     if check_status -q $DHCPDv4_PID $NAME4; then
     log_daemon_msg "Stopping $DESC4" "$NAME4"
     start-stop-daemon --stop --quiet --pidfile $DHCPDv4_PID
     log_end_msg $?
     rm -f "$DHCPDv4_PID"
     fi
     if check_status -q $DHCPDv6_PID $NAME6; then
     log_daemon_msg "Stopping $DESC6" "$NAME6"
     start-stop-daemon --stop --quiet --pidfile $DHCPDv6_PID
     log_end_msg $?
     rm -f "$DHCPDv6_PID"
     fi
    }
    case "1ドル" in
     start)
     if test -n "$INTERFACES" -a -z "$INTERFACESv4"; then
     echo "DHCPv4 interfaces are no longer set by the INTERFACES variable in" >&2
     echo "/etc/default/isc-dhcp-server. Please use INTERFACESv4 instead." >&2
     echo "Migrating automatically for now, but this will go away in the future." >&2
     INTERFACESv4="$INTERFACES"
     fi
     if test -n "$INTERFACESv4"; then
     echo "Launching IPv4 server only."
     start_daemon "-4" "$DHCPDv4_CONF" "$NAME4" \
     "$DHCPDv4_PID" "$DESC4" "$INTERFACESv4"
     fi
     if test -n "$INTERFACESv6"; then
     echo "Launching IPv6 server only."
     start_daemon "-6" "$DHCPDv6_CONF" "$NAME6" \
     "$DHCPDv6_PID" "$DESC6" "$INTERFACESv6"
     fi
     if test -z "$INTERFACESv4" -a -z "$INTERFACESv6"; then
     echo "Launching both IPv4 and IPv6 servers (please configure INTERFACES in /etc/default/isc-dhcp-server if you only want one or the other)."
     start_daemon "-4" "$DHCPDv4_CONF" "$NAME4" \
     "$DHCPDv4_PID" "$DESC4" ""
     start_daemon "-6" "$DHCPDv6_CONF" "$NAME6" \
     "$DHCPDv6_PID" "$DESC6" ""
     fi
     ;;
     stop)
     stop_daemon
     ;;
     restart | force-reload)
     0ドル stop
     sleep 2
     0ドル start
     if [ "$?" != "0" ]; then
     exit 1
     fi
     ;;
     status)
     if test -n "$INTERFACES" -a -z "$INTERFACESv4"; then
     INTERFACESv4="$INTERFACES"
     fi
     if test -n "$INTERFACESv4"; then
     echo -n "Status of $DESC4: "
     check_status -v $DHCPDv4_PID $NAME4 || exit $?
     fi
     if test -n "$INTERFACESv6"; then
     echo -n "Status of $DESC6: "
     check_status -v $DHCPDv6_PID $NAME6 || exit $?
     fi
     ;;
     *)
     echo "Usage: 0ドル {start|stop|restart|force-reload|status}"
     exit 1
    esac
    exit 0

    Le fichier run de voidlinux pour dhcpd:

    #!/bin/sh
    [ -r conf ] && . ./conf
    mkdir -p /var/lib/dhcp/
    touch /var/lib/dhcp/dhcpd.leases
    exec dhcpd -f ${OPTS:=-4 -q -pf /run/dhcpd4.pid}