No quiero hacer lo correcto al crear un nuevo script systemd, solo quiero que mi antiguo script init vuelva a funcionar ahora que he actualizado mi sistema a un sistema operativo que usa systemd.
He investigado brevemente cómo convertir scripts de inicio y cómo escribir scripts de systemd, pero estoy seguro de que aprenderlo correctamente y hacerlo bien me llevaría varias horas.
La situación actual es:
systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
Y:
sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.
En este momento, solo quiero volver al trabajo. ¿Cuál es el camino de menor resistencia para que esto vuelva a funcionar?
Actualizaciones
No quería resolver todo esto, realmente no lo hice, pero tengo que hacerlo y he descubierto mi primera pista:
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 página de incompatibilidades para systemd dice que:
La información de dependencia del encabezado LSB es importante. Las implementaciones de SysV en muchas distribuciones no usaban la información de dependencia codificada en los encabezados del script de inicio LSB, o las usaban solo de manera muy limitada. Debido a eso, a menudo son incorrectos o incompletos. Sin embargo, systemd interpreta completamente estos encabezados y los sigue de cerca en tiempo de ejecución
Creo que eso significa que mi script no funcionará hasta que se solucione.
El guión en cuestión:
#!/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
Respuestas:
En serio, un archivo de unidad systemd es trivial para escribir para un servicio como este ... o para la mayoría de los servicios.
Esto debería llevarte a aproximadamente el 95% del camino. Pon esto en, por ejemplo,
/etc/systemd/system/solr.service
Tenga en cuenta las cosas que no están aquí, como el archivo de registro y tal; systemd capturará y registrará automáticamente la salida del servicio con el nombre del servicio.
fuente
systemd
tiene algunas rarezas, como este script no tendrá registros persistentes a menos que lo active. Al final, funciona y tu empuje fue lo que necesitaba, gracias.Para mí fue más fácil simplemente agregar el bloque de información de inicio en el encabezado como se sugiere aquí :
Entonces, ejecuta
sudo systemctl enable solr
.fuente
"contains no runlevels, aborting"
error) hasta que me di cuenta: un tercer # faltante en su segunda línea (debería ser### BEGIN INIT INFO
). Apuesto a que eso también explicaría por qué también tienes tan pocos votos.Otra solución para usar el script de inicio heredado solr con systemd:
fuente
Es más conveniente ejecutar Solr utilizando el script de inicio proporcionado .
El archivo de unidad systemd se ve así:
Tenga en cuenta que también puede hacer uso de sus variables de entorno agregando
EnvironmentFile
a la[Service]
sección. El scriptbin/solr
respeta las variables de entorno, solo eche un vistazo.fuente
Probado en Debian: Agregue '_SYSTEMCTL_SKIP_REDIRECT = OHYES' al comienzo del script.
Puede que a los fanáticos de Systemd no les guste, pero bueno, no me gusta systemd, así que ahí :).
fuente
SYSTEMCTL_SKIP_REDIRECT=true
en redhat_
(subrayado) antesSYSTEMCTL
, así:_SYSTEMCTL_SKIP_REDIRECT=1
. Si intenta eso desde la línea de comandos, también necesita exportar esa var.Tuve el mismo error al intentar usar un script de inicio LSB en CentOS 7. La causa raíz resultó ser que el script era un enlace simbólico. Una vez reemplazado con una copia del original, todo funcionó bien.
fuente