• [^] # Re: Je pose la question dans l'autre sens

    Posté par . En réponse au journal Les problèmes d’un desktop sans systemd ?. Évalué à 2.

    le BASH/SH/*SH c'est juste une syntaxe horrible, avec aucune robustesse, et quand quelqu'un le maîtrise bien, le relire c'est juste mission impossible

    C'est l'un des rares arguments valables pour systemd, sauf que... ben, les unit systemd ne semblent pas si simples que ça non plus.
    Peu importe que ça soit vrai ou pas, peut-être sera-tu intrigué par ces alternatives comme je l'ai été (mais jamais assez pour tester le code sur mes machines perso!):

    • dinit, le dernier que j'ai "trouvé" en faisant le zombi sur IRC. Il me semble qu'il utilise une syntaxe déclarative, comme systemd.
    • s6 qui utilise son propre DSL, justement parce que comme tu l'as pointé, bourne shell est loin d'être sympa.

    Bon, après, mon script runit le plus compliqué, et de très, très loin, c'est celui qui démarre udevd-systemd, programme qui existait bien avant systemd (donc, ses défauts ne proviennent pas de systemd), que voici:

    #!/bin/sh
    . /etc/runit/common
    need()
    {
     i=0
     while ! test -e "1ドル"
     do
     sleep "0.$i"
     test "$i" = 9 || i=$((i+1))
     done
    }
    mkdir -p /run/udev
    rm -f /run/udev/control #just in case
    rm -f /run/udevd_ready #just in case
    (
     need /run/udev/control # not sure we really need to wait for it
     echo "Trigger+settle:"
     udevadm --debug trigger --type=subsystems --action=add
     udevadm --debug trigger --type=devices --action=add
     udevadm --debug settle
     >/run/udevd_ready
     echo "Done: trigger+settle"
    ) &
    echo "Starting $SVNAME"
    exec env - PATH="$PATH" /lib/systemd/systemd-udevd -N late
    

    Quant à sa dépendance, qui est un truc que je source de partout:

    #!/bin/sh
    #this file provides some automatic features for runit daemons
    #notably it:
    #* provides the variable SVNAME, which is the name of the daemon dir
    #* provides the die() function
    #* sources an existing ./conf file
    #* automatically rotates logs on startup if there are logs and AUTO_ROTATE=yes
    #* redirects stderr to stdout
    #* enables some shell verbosity and safeties (-xe)
    die()
    {
     printf "%s\n" "$@" | tee ./down
     exit 1
    }
    SVNAME="$(basename $(pwd))"
    HAS_LOG="$(test -d "$(pwd)/log" && printf "yes")"
    exec 0<&-
    exec 2>&1
    set -xe
    test -f conf && . ./conf
    if test "0ドル" = "run"
    then
     if test "$SVNAME" = "log"
     then
     SVLOG="$(basename $(dirname $(pwd)))"
     SVNAME="${SVLOG}/${SVNAME}"
     AUTO_ROTATE="${AUTO_ROTATE:="no"}"
     fi
     test "yes" = "${AUTO_ROTATE}" -a "yes" = "$HAS_LOG" && \
     sv alarm "$(pwd)/log"
    fi
    

    On est très loin, je pense, des horribles scripts que l'on vois pour rc.d dans debian, notamment, pas vrai?
    D'ailleurs sur ce système j'ai un peu fait les trucs en mode organique, du coup s'pas super clean...

    La quasi totalité des autres daemons sont lancés ainsi:

    #!/bin/sh
    . /etc/runit/common
    test -e /run/sshd || mkdir /run/sshd
    echo "Starting $SVNAME"
    exec /usr/sbin/sshd -D -e
    

    Comme tu le vois, c'est très simple, et ça ne gère pas l'un des autres avantages de systemd: la gestion des dépendances. D'un autre côté, en pratique ce n'est pas gênant, surtout sur un desktop. Je fais aussi tourner mon Xorg de cette façon, mais i3 n'aime pas trop mon humour, il faut que je trouve la motivation pour utiliser un truc un peu moins monolithique pour avoir vraiment ce que je veux. Notamment, avoir les entrées contrôlées par leur propre daemon, au lieu d'avoir le WM qui fait tout: son job, c'est les fenêtres, par les raccourcis clavier, après tout.
    Mais bon, je comprend que des gens qui ont autre chose a faire ne s'amusent pas avec ça :) (sur un bureau, du moins)