Was ist der einfachste Weg, um mein altes Init-Skript in systemd zum Laufen zu bringen?

48

Ich möchte nicht das Richtige tun, indem ich ein neues systemd-Skript erstelle. Ich möchte nur, dass mein altes init-Skript wieder funktioniert, nachdem ich mein System auf ein Betriebssystem aktualisiert habe, das systemd verwendet.

Ich habe kurz nachgeforscht, wie man Init-Skripte konvertiert und wie man systemd-Skripte schreibt, aber ich bin sicher, dass es mehrere Stunden dauern würde, es richtig zu lernen und es richtig zu machen.

Die aktuelle Situation ist:

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

Und:

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

Im Moment möchte ich einfach wieder an die Arbeit gehen. Was ist der Weg des geringsten Widerstands dagegen, dass dies wieder funktioniert?

Aktualisierung

Ich wollte das alles nicht herausfinden - ich tat es wirklich nicht - aber ich muss und ich habe meinen ersten Hinweis gefunden:

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.

Auf der Inkompatibilitätsseite für systemd heißt es:

Informationen zur Abhängigkeit von LSB-Headern sind wichtig. Die SysV-Implementierungen in vielen Distributionen verwendeten die in LSB-Init-Skript-Headern codierten Abhängigkeitsinformationen nicht oder nur in sehr begrenztem Umfang. Aufgrund dessen sind sie oft falsch oder unvollständig. systemd interpretiert diese Header jedoch vollständig und folgt ihnen zur Laufzeit genau

Ich denke, das bedeutet, dass mein Skript nicht funktioniert, bis das behoben ist.

Das fragliche Skript:

#!/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
mlissner
quelle
"Ich will nicht das Richtige tun" wird dir viel negatives Feedback einbringen. Ich hoffe, Sie haben Ihren Schutzanzug angezogen. Auf jeden Fall ist der Weg des geringsten Widerstands nichts ; Verwenden Sie einfach Ihr Init-Skript.
Michael Hampton
6
Eines Tages werde ich sicher das Richtige tun. Aber wir leben in einer Welt mit begrenzten Ressourcen. Ich habe weitere Details hinzugefügt, was nicht funktioniert, da dies anscheinend bereits funktionieren soll.
mlissner
Versuchen Sie dies auf Ubuntu zu tun? Gott helfe dir, warum?
Michael Hampton
1
Ich bin. Ist das schlimmer als irgendwo anders?
mlissner
1
Unter all den anderen Versäumnissen von Ubuntu ist das Relevante hier, dass Upstart ein schrecklicher Albtraum war. Es ist gut , dass sie endlich loswerden es immer, aber Ihr Init - Skript wie ist damit nicht wirklich kompatibel. Wie es vorher funktionierte, hängt höchstwahrscheinlich mit der (alten) SysV-Kompatibilität zusammen, und während systemd damit umgehen kann, hat Ubuntu anscheinend etwas unternommen, um es zu zerstören. Ich würde nicht empfehlen, zu versuchen, diese Funktion zu nutzen, zumal Sie viel weniger Zeit für das Schreiben der systemd-Unit-Datei aufgewendet hätten, als Sie bereits damit verbracht haben.
Michael Hampton

Antworten:

34

Im Ernst, eine systemd Unit-Datei ist trivial für einen Dienst wie diesen ... oder für die meisten Dienste zu schreiben.

Dies sollte Ihnen ungefähr 95% des Weges dorthin ermöglichen. Setzen Sie dies zum Beispiel in/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

Beachten Sie die Dinge, die nicht hier sind, wie die Protokolldatei und so weiter. systemd erfasst und protokolliert die Dienstausgabe automatisch unter dem Namen des Dienstes.

Michael Hampton
quelle
5
Nun, ich brauchte mehr oder weniger den ganzen Tag, um mich zu optimieren und zu konfigurieren und so weiter. systemdhat einige Kuriositäten, wie dieses Skript nicht persistente Protokolle haben, wenn Sie das aktivieren. Am Ende funktioniert es aber und dein Push war genau das, was ich brauchte, danke.
mlissner
15

Für mich war es einfacher, den Init-Infoblock wie hier vorgeschlagen in den Header einzufügen :

#!/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

Führen Sie dann aus sudo systemctl enable solr.

eadmaster
quelle
1
Sie haben einen Tippfehler in Ihrem Code, der derselbe ist, den ich hatte, und der verhindert hat, dass mein Skript funktioniert (wodurch der berüchtigte "contains no runlevels, aborting"Fehler verursacht wurde), bis ich bemerkte: ein fehlendes drittes # in Ihrer zweiten Zeile (sollte es sein ### BEGIN INIT INFO). Ich wette, das würde auch erklären, warum du auch so wenig Stimmen hast.
Pere
1
Hoppla, Sie haben Recht, wahrscheinlich wurde es beim Kopieren und Einfügen entfernt! (jetzt behoben)
eadmaster
7

Eine andere Lösung, um das solr-Legacy-Init-Skript mit systemd zu verwenden:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
grégory eve
quelle
1
Das hat er schon ausprobiert und es hat nicht funktioniert, weil Ubuntu fehlerhaft ist.
Michael Hampton
4

Es ist praktischer, Solr mit dem mitgelieferten Startskript auszuführen .

Die systemd-Unit-Datei sieht folgendermaßen aus:

[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

Beachten Sie, dass Sie Ihre Umgebungsvariablen auch verwenden können, indem Sie EnvironmentFilesie dem [Service]Abschnitt hinzufügen . Das Skript bin/solrrespektiert Umgebungsvariablen, schauen Sie einfach mal rein.

Jiří Kozlovský
quelle
Das ist heute in Ordnung. Zu dem Zeitpunkt, als die Frage ursprünglich geschrieben wurde, gab es für Solr keine bereitgestellte Systemeinheit.
Michael Hampton
1

Getestet unter Debian: Fügen Sie '_SYSTEMCTL_SKIP_REDIRECT = OHYES' am Anfang des Skripts hinzu.

Systemd-Fans mögen es vielleicht nicht, aber hey, ich mag systemd nicht, also da :).

Guy Egozy
quelle
oder SYSTEMCTL_SKIP_REDIRECT=truein
Red Hat
hat bei mir nicht funktioniert :(
eadmaster
Stellen Sie sicher , dass Sie hinzufügen _(Unterstrich) vor SYSTEMCTL, wie folgt aus : _SYSTEMCTL_SKIP_REDIRECT=1. Wenn Sie das von der Kommandozeile aus versuchen, müssen Sie auch diese Variable exportieren.
Uhr
1

Ich hatte den gleichen Fehler beim Versuch, ein LSB-Init-Skript unter CentOS 7 zu verwenden. Die Ursache war, dass das Skript eine symbolische Verknüpfung war. Einmal durch eine Kopie des Originals ersetzt, funktionierte alles einwandfrei.

gatopeich
quelle
Das hätte auch für mein Drehbuch der Fall sein können.
mlissner