Je ne veux pas faire la bonne chose en créant un nouveau script systemd, je veux juste que mon ancien script init fonctionne à nouveau maintenant que j'ai mis à niveau mon système vers un système d'exploitation qui utilise systemd.
J'ai brièvement recherché comment convertir des scripts init et comment écrire des scripts systemd, mais je suis sûr que l'apprendre correctement et le faire correctement me prendrait plusieurs heures.
La situation actuelle est la suivante:
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 moindre résistance pour que cela fonctionne à nouveau?
Je ne voulais pas tout comprendre - je ne le savais vraiment pas - 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.
La page des incompatibilités pour systemd dit que:
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'initialisation LSB, ou les utilisaient uniquement de manière très limitée. Pour cette raison, ils sont souvent incorrects ou incomplets. systemd interprète cependant entièrement ces en-têtes et les suit de près lors de l'exécution
Je pense que cela signifie que mon script ne fonctionnera pas tant que ce n'est pas résolu.
#!/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
Sérieusement, un fichier d'unité systemd est trivial à écrire pour un service comme celui-ci ... ou pour la plupart des services.
Cela devrait vous apporter environ 95% du chemin. Mettez ceci, 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 capturera et enregistrera automatiquement la sortie du service sous le nom du service.
Pour moi, il était plus facile d'ajouter simplement le bloc info 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
.
Une autre solution pour utiliser le script d'initialisation solr hérité avec systemd:
systemctl daemon-reload
systemctl enable solr
systemctl start solr
Il est plus pratique d'exécuter Solr en utilisant 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
à [Service]
section. Le scénario bin/solr
respecte les variables d'environnement, jetez-y un œil.
J'ai eu la même erreur en essayant d'utiliser un script d'initialisation LSB sur CentOS 7. La cause fondamentale s'est avérée être que le script était un lien symbolique. Une fois remplacé par une copie de l'original, tout a bien fonctionné.
Testé sur Debian: ajoutez '_SYSTEMCTL_SKIP_REDIRECT = OHYES' au début du script.
Les fanboys de Systemd pourraient ne pas l'aimer mais bon, je n'aime pas systemd, donc là :).