• [^] # Re: systemd

    Posté par . En réponse à la dépêche Petit état de l'art des systèmes d'initialisation (1). Évalué à 10.

    Rho le gros pâté de shell... Bah c’est pas très beau, mais bon faudrait une vraie comparaison (même démon et code équivalent).

    Je suis un type allergique au shell, quand ça dépasse 500 lignes. Mais là, ce n'est pas le cas :

    wc -l etc/rc 
    74 etc/rc
    

    J'ai pas tendance à appeler 74 lignes "un gros paquet". Suivant ton raisonnement, je dirais que systemd c'est "un gros paquet de C".
    Si tu parles des scripts rc, écrits par les mainteneurs, ils ont une syntaxe claire, et offrent une plus grande souplesse de configuration que les unit systemd. Regardons si cette souplesse conduit à "un gros paquet" :

    systemd :

    [Unit]
    Description=PostgreSQL database server
    After=network.target
    [Service]
    Type=forking
    TimeoutSec=120
    User=postgres
    Group=postgres
    Environment=PGROOT=/var/lib/postgres
    SyslogIdentifier=postgres
    PIDFile=/var/lib/postgres/data/postmaster.pid
    ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGROOT}/data
    ExecStart= /usr/bin/pg_ctl -s -D ${PGROOT}/data start -w -t 120
    ExecReload=/usr/bin/pg_ctl -s -D ${PGROOT}/data reload
    ExecStop= /usr/bin/pg_ctl -s -D ${PGROOT}/data stop -m fast
    # Due to PostgreSQL's use of shared memory, OOM killer is often overzealous in
    # killing Postgres, so adjust it downward
    OOMScoreAdjust=-200
    [Install]
    WantedBy=multi-user.target
    

    Taille :
    26 lignes.
    Documentation :
    aucune.
    Coniguration :
    Possibilité de configurer le dossier contenant les fichiers de la base de donnée.

    rcNG :

    # PROVIDE: postgresql
    # REQUIRE: LOGIN
    # KEYWORD: shutdown
    #
    # Add the following line to /etc/rc.conf to enable PostgreSQL:
    #
    # postgresql_enable="YES"
    # # optional
    # postgresql_data="/usr/local/pgsql/data"
    # postgresql_flags="-w -s -m fast"
    # postgresql_initdb_flags="--encoding=utf-8 --lc-collate=C"
    # postgresql_class="default"
    # postgresql_profiles=""
    #
    # See /usr/local/share/doc/postgresql/README-server for more info
    #
    # This scripts takes one of the following commands:
    #
    # start stop restart reload status initdb
    #
    # For postmaster startup options, edit ${postgresql_data}/postgresql.conf
    command=/usr/local/bin/pg_ctl
    . /etc/rc.subr
    load_rc_config postgresql
    # set defaults
    postgresql_enable=${postgresql_enable:-"NO"}
    postgresql_flags=${postgresql_flags:-"-w -s -m fast"}
    postgresql_user=${postgresql_user:-"pgsql"}
    eval postgresql_data=${postgresql_data:-"~${postgresql_user}/data"}
    postgresql_class=${postgresql_class:-"default"}
    postgresql_initdb_flags=${postgresql_initdb_flags:-"--encoding=utf-8 --lc-collate=C"}
    name=postgresql
    rcvar=postgresql_enable
    extra_commands="reload initdb"
    start_cmd="postgresql_command start"
    stop_cmd="postgresql_command stop"
    restart_cmd="postgresql_command restart"
    reload_cmd="postgresql_command reload"
    status_cmd="postgresql_command status"
    initdb_cmd="postgresql_initdb"
    if [ -n "2ドル" ]; then
     profile="2ドル"
     if [ "x${postgresql_profiles}" != "x" ]; then
     eval postgresql_data="\${postgresql_${profile}_data:-}"
     if [ "x${postgresql_data}" = "x" ]; then
     echo "You must define a data directory (postgresql_${profile}_data)"
     exit 1
     fi
     eval postgresql_enable="\${postgresql_${profile}_enable:-${postgresql_enable}}
     eval postgresql_data="\${postgresql_${profile}_data:-${postgresql_data}}
     eval postgresql_flags="\${postgresql_${profile}_flags:-${postgresql_flags}}"
     eval postgresql_initdb_flags="\${postgresql_${profile}_initdb_flags:-${postgresql_initdb_flags}}"
     fi
    else
     if [ "x${postgresql_profiles}" != "x" -a "x1ドル" != "x" ]; then
     for profile in ${postgresql_profiles}; do
     eval _enable="\${postgresql_${profile}_enable}"
     case "x${_enable:-${postgresql_enable}}" in
     x|x[Nn][Oo]|x[Nn][Oo][Nn][Ee])
     continue
     ;;
     x[Yy][Ee][Ss])
     ;;
     *)
     if test -z "$_enable"; then
     _var=postgresql_enable
     else
     _var=postgresql_"${profile}"_enable
     fi
     echo "Bad value" \
     "'${_enable:-${postgresql_enable}}'" \
     "for ${_var}. " \
     "Profile ${profile} skipped."
     continue
     ;;
     esac
     echo "===> postgresql profile: ${profile}"
     /usr/local/etc/rc.d/postgresql 1ドル ${profile}
     retcode="$?"
     if [ "0${retcode}" -ne 0 ]; then
     failed="${profile} (${retcode}) ${failed:-}"
     else
     success="${profile} ${success:-}"
     fi
     done
     exit 0
     fi
    fi
    command_args="-D ${postgresql_data} ${postgresql_flags}"
    postgresql_command()
    {
     su -l ${postgresql_user} -c "exec ${command} ${command_args} ${rc_arg}"
    }
    postgresql_initdb()
    {
     su -l -c ${postgresql_class} ${postgresql_user} -c "exec /usr/local/bin/initdb ${postgresql_initdb_flags} -D ${postgresql_data}"
    }
    run_rc_command "1ドル"
    

    taille :
    114 lignes.
    Documentation :
    les valeurs de configuration possibles sont documentées.
    Configuration :
    possibilité de choisir les options de la base de donnée, de créer une nouvelle base de donnée, et de choisir plusieurs profils.

    Ramenons maintenant cela au même niveau de fonctionnalité que systemd :

    # PROVIDE: postgresql
    # REQUIRE: LOGIN
    # KEYWORD: shutdown
    command=/usr/local/bin/pg_ctl
    . /etc/rc.subr
    # set defaults
    postgresql_enable=${postgresql_enable:-"NO"}
    eval postgresql_data=${postgresql_data:-"~${postgresql_user}/data"}
    name=postgresql
    rcvar=postgresql_enable
    start_cmd="postgresql_command start"
    stop_cmd="postgresql_command stop"
    restart_cmd="postgresql_command restart"
    reload_cmd="postgresql_command reload"
    status_cmd="postgresql_command status"
    postgresql_command()
    {
     su -l pgsql -c "exec ${command} -D ${postgresql_data} -w -s -m fast ${rc_arg}"
    }
    run_rc_command "1ドル"
    

    Lignes :
    27

    Ça ressemble vachement à systemd, j'ai l'impression. Des déclarations de variables pour les commandes à éxécuter, avec la possibilité de factoriser le code dans une fonction. J'ai l'impression que ton commentaire sur la syntaxe illisible est un troll, je te mets au défi de me donner un argument objectif sur ce point.