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
Antworten:
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
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.
quelle
systemd
hat 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.Für mich war es einfacher, den Init-Infoblock wie hier vorgeschlagen in den Header einzufügen :
Führen Sie dann aus
sudo systemctl enable solr
.quelle
"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.Eine andere Lösung, um das solr-Legacy-Init-Skript mit systemd zu verwenden:
quelle
Es ist praktischer, Solr mit dem mitgelieferten Startskript auszuführen .
Die systemd-Unit-Datei sieht folgendermaßen aus:
Beachten Sie, dass Sie Ihre Umgebungsvariablen auch verwenden können, indem Sie
EnvironmentFile
sie dem[Service]
Abschnitt hinzufügen . Das Skriptbin/solr
respektiert Umgebungsvariablen, schauen Sie einfach mal rein.quelle
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 :).
quelle
SYSTEMCTL_SKIP_REDIRECT=true
in_
(Unterstrich) vorSYSTEMCTL
, wie folgt aus :_SYSTEMCTL_SKIP_REDIRECT=1
. Wenn Sie das von der Kommandozeile aus versuchen, müssen Sie auch diese Variable exportieren.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.
quelle