¿Cuál es la forma más fácil de hacer que mi antiguo script de inicio funcione en systemd?

48

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
mlissner
fuente
"No quiero hacer lo correcto" te dará muchos comentarios negativos. Espero que te hayas puesto tu traje de materiales peligrosos. De todos modos, el camino de menor resistencia no es nada ; solo usa tu script de inicio.
Michael Hampton
66
Un día, seguramente, haré lo correcto. Pero vivimos en un mundo de recursos limitados. He agregado más detalles sobre lo que no está funcionando, ya que aparentemente esto ya debería funcionar.
mlissner
¿Estás tratando de hacer esto en Ubuntu? Dios te ayude, ¿por qué?
Michael Hampton
1
Soy. ¿Es eso peor que en cualquier otro lugar?
mlissner
1
Entre todas las otras fallas de Ubuntu, la relevante aquí es que Upstart fue una pesadilla terrible. Es bueno que finalmente lo eliminen, pero su script de inicio tal cual no es realmente compatible con él. Lo más probable es que haya funcionado antes a través de la compatibilidad (antigua) SysV, y aunque systemd puede manejar esto, Ubuntu aparentemente ha hecho algo para romperlo. No recomendaré que intente hacer que esto funcione, especialmente porque le habría llevado mucho menos tiempo escribir el archivo de la unidad systemd de lo que ya ha dedicado a esto.
Michael Hampton

Respuestas:

34

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

[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

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.

Michael Hampton
fuente
55
Bueno, esto me llevó más o menos todo el día para ajustar y configurar y todo. systemdtiene 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.
mlissner
15

Para mí fue más fácil simplemente agregar el bloque de información de inicio en el encabezado como se sugiere aquí :

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

Entonces, ejecuta sudo systemctl enable solr.

Eadmaster
fuente
1
Tiene un error tipográfico en su código que resulta ser el mismo que tenía y estaba impidiendo que mi script funcione (obteniendo así el infame "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.
Pere
1
¡Vaya, tienes razón, probablemente se eliminó en el proceso de copiar y pegar! (solucionado ahora)
eadmaster
7

Otra solución para usar el script de inicio heredado solr con systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
víspera de grégory
fuente
1
Él ya se intentó, y no funcionó, ya que Ubuntu está libre de errores.
Michael Hampton
4

Es más conveniente ejecutar Solr utilizando el script de inicio proporcionado .

El archivo de unidad systemd se ve así:

[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

Tenga en cuenta que también puede hacer uso de sus variables de entorno agregando EnvironmentFilea la [Service]sección. El script bin/solrrespeta las variables de entorno, solo eche un vistazo.

Jiří Kozlovský
fuente
Esto está bien hoy. En el momento en que la pregunta se escribió originalmente, no había una unidad systemd proporcionada para Solr.
Michael Hampton
1

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í :).

Guy Egozy
fuente
o SYSTEMCTL_SKIP_REDIRECT=trueen redhat
Oteo
no funcionó para mí :(
eadmaster
Asegúrese de añadir _(subrayado) antes SYSTEMCTL, así: _SYSTEMCTL_SKIP_REDIRECT=1. Si intenta eso desde la línea de comandos, también necesita exportar esa var.
timurb
1

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.

gatopeich
fuente
Ese podría haber sido el caso de mi guión también.
mlissner