Question Quel est le moyen le plus simple de faire fonctionner mon ancien script init dans systemd?


Je ne veux pas faire le bon choix en créant un nouveau script systemd, je veux simplement que mon ancien script init fonctionne à nouveau maintenant que j'ai mis à niveau mon système vers un système d'exploitation utilisant systemd.

J'ai brièvement cherché à convertir des scripts d'initialisation et à écrire des scripts systemd, mais je suis certain que l'apprendre correctement et bien le faire me prendrait plusieurs heures.

La situation actuelle est:

systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

Et:

sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

En ce moment, je veux juste retourner au travail. Quel est le chemin de moins résistance à ce que cela fonctionne à nouveau?

Mises à jour

Je ne voulais pas comprendre tout cela - je ne l'avais vraiment pas fait - mais je dois le faire et j'ai découvert mon premier indice:

sudo systemctl enable solr
Synchronizing state for solr.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d solr defaults
insserv: warning: script 'K01solr' missing LSB tags and overrides
insserv: warning: script 'solr' missing LSB tags and overrides
Executing /usr/sbin/update-rc.d solr enable
update-rc.d: error: solr Default-Start contains no runlevels, aborting.

le page incompatibilités pour systemd dit ça:

Les informations de dépendance d'en-tête LSB sont importantes. Les implémentations SysV sur de nombreuses distributions n’utilisaient pas les informations de dépendance codées dans les en-têtes de script d’init LSB, ni de manière très limitée. Pour cette raison, ils sont souvent incorrects ou incomplets. systemd interprète toutefois complètement ces en-têtes et les suit de près au moment de l'exécution

Je pense que cela signifie que mon script ne fonctionnera pas tant que ce ne sera pas corrigé.

Le script en question:

#!/bin/sh

# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root
# 4. $INSTALL_ROOT must be set

# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be
# created in the standard location.

start () {
    echo -n "Starting solr..."

    # Reset ulimit or else get issues with too many open files (https://issues.apache.org/jira/browse/SOLR-4)
    ulimit -n 10000

    # start daemon
    daemon --chdir='/usr/local/solr/example' --command "java -jar -server start.jar -DINSTALL_ROOT=$INSTALL_ROOT" --respawn --output=/var/log/solr/solr.log --name=solr --verbose

    RETVAL=$?
    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}

stop () {
    # stop daemon
    echo -n "Stopping solr..."

    daemon --stop --name=solr  --verbose
    RETVAL=$?

    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}


restart () {
    daemon --restart --name=solr  --verbose
}


status () {
    # report on the status of the daemon
    daemon --running --verbose --name=solr
    return $?
}


case "$1" in
    start)
        start
    ;;
    status)
        status
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        sleep 15
        start
    ;;
    *)
        echo $"Usage: solr {start|status|stop|restart}"
        exit 3
    ;;
esac

exit $RETVAL

40
2018-05-06 22:57


origine


"Je ne veux pas faire la bonne chose" va vous donner beaucoup de commentaires négatifs. J'espère que vous avez revêtu votre combinaison de matières dangereuses. Quoi qu’il en soit, le chemin de moindre résistance est rien; utilisez simplement votre script init. - Michael Hampton♦
Un jour, sûrement, je ferai la bonne chose. Mais nous vivons dans un monde de ressources limitées. J'ai ajouté plus de détails sur ce qui ne fonctionne pas, car apparemment, cela est censé fonctionner déjà. - mlissner
Est-ce que vous essayez de faire cela sur Ubuntu? Dieu vous aide, pourquoi? - Michael Hampton♦
Je suis. Est-ce pire que nulle part ailleurs? - mlissner
Parmi tous les autres échecs d'Ubuntu, le plus pertinent ici est que Upstart était un cauchemar divin. C'est bien qu'ils s'en débarrassent enfin, mais votre script d'initialisation comme si n'est pas vraiment compatible avec cela. La manière dont cela fonctionnait auparavant est probablement due à la compatibilité (ancienne) SysV, et bien que systemd puisse gérer cela, Ubuntu a apparemment fait quelque chose pour la résoudre. Je ne recommanderai pas d'essayer de faire ce travail, d'autant plus qu'il aurait fallu beaucoup moins de temps pour écrire le fichier d'unité systemd que ce que vous avez déjà dépensé pour cela. - Michael Hampton♦


Réponses:


Sérieusement, un fichier unité systemd est facile à écrire pour un service comme celui-ci ... ou pour la plupart des services.

Cela devrait vous permettre d’environ 95% du trajet. Mettez ceci dans, par exemple, /etc/systemd/system/solr.service

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
EnvironmentFile=/etc/courtlistener
WorkingDirectory=/usr/local/solr/example
ExecStart=/usr/bin/java -jar -server -Xmx${CL_SOLR_XMX} start.jar -DINSTALL_ROOT=${INSTALL_ROOT}
Restart=on-failure
LimitNOFILE=10000

[Install]
WantedBy=multi-user.target

Notez les choses qui n'est pas ici, comme le fichier journal et autres; systemd va automatiquement capturer et enregistrer la sortie du service sous le nom du service.


27
2018-05-07 01:42



Eh bien, cela m'a pris plus ou moins toute la journée pour être peaufiné et configuré et tout. systemd a quelques bizarreries, comme ce script n’aura pas de journaux persistants à moins d’activer cela. En fin de compte, cela fonctionne bien et votre effort était ce dont j'avais besoin, merci. - mlissner


Pour moi, il était plus facile d'ajouter le bloc d'informations init dans l'en-tête comme suggéré ici:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          solr
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: solr
# Description:       solr
### END INIT INFO

Ensuite, exécutez sudo systemctl enable solr.


12
2018-03-18 06:57



Dans votre code, vous avez une faute de frappe qui est identique à celle que j'avais et empêchait mon script de fonctionner (obtenant ainsi le fameux "contains no runlevels, aborting" erreur) jusqu'à ce que je m'en rende compte: un troisième numéro manquant dans votre deuxième ligne (CA devrait etre ### BEGIN INIT INFO). Je parie que cela expliquerait aussi pourquoi vous avez si peu de votes aussi. - Pere
oups, vous avez raison, il a probablement été supprimé lors du copier-coller! (corrigé maintenant) - eadmaster


Une autre solution consiste à utiliser le script init solr hérité avec systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

7
2017-08-13 08:56



Il déjà essayé cela, et cela n'a pas fonctionné, car Ubuntu est un buggy. - Michael Hampton♦


C'est plus pratique d'utiliser Solr avec script de démarrage fourni.

Le fichier d'unité systemd ressemble à ceci:

[Unit]
Description=Apache Solr for Nextcloud's nextant app fulltext indexing
After=syslog.target network.target remote-fs.target nss-lookup.target systemd-journald-dev-log.socket
Before=nginx.service

[Service]
Type=forking
User=solr
WorkingDirectory=/path/to/solr/server
ExecStart=/path/to/solr/bin/solr start
ExecStop=/path/to/solr/bin/solr stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

Notez que vous pouvez également utiliser vos variables d’environnement en ajoutant EnvironmentFile au [Service] section. Le scénario bin/solr respecte les variables d'environnement, jetez-y un coup d'oeil.


4
2017-09-01 07:41



C'est bien aujourd'hui. Au moment où la question a été écrite à l'origine, il n'y avait pas d'unité systemd fournie pour Solr. - Michael Hampton♦


Testé sur Debian: Ajoutez '_SYSTEMCTL_SKIP_REDIRECT = OHYES' au début du script.

Les fans de Systemd pourraient ne pas l’aimer mais bon, je n’aime pas systemd, alors là :).


1
2017-09-15 10:37



ou SYSTEMCTL_SKIP_REDIRECT=true à redhat - Otheus
N'a pas travaillé pour moi :( - eadmaster
Assurez-vous d'ajouter _ (trait de soulignement) avant SYSTEMCTL, comme ça: _SYSTEMCTL_SKIP_REDIRECT=1. Si vous essayez cela depuis la ligne de commande, vous devez également exporter cette variable. - timurb


J'ai eu la même erreur en essayant d'utiliser un script d'initialisation LSB sur CentOS 7. La cause fondamentale était que le script était un lien symbolique. Une fois remplacé par une copie de l'original, tout a bien fonctionné.


1
2017-11-15 07:52



Cela aurait pu être le cas pour mon script aussi. - mlissner