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


No quiero hacer lo correcto creando un nuevo script de systemd, solo quiero que mi antiguo script de inicio vuelva a funcionar ahora que he actualizado mi sistema a un sistema operativo que usa systemd.

He investigado brevemente cómo convertir guiones de inicio y cómo escribir guiones de sistema, 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, sólo quiero volver al trabajo. Cual es el camino de menos ¿Resistencia a que esto funcione de nuevo?

Actualizaciones

No quería entender todo esto, realmente no lo hice, pero tengo que hacerlo y desenterré 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.

los página de incompatibilidades para systemd dice que:

La información de dependencia de cabecera LSB importa. Las implementaciones de SysV en muchas distribuciones no utilizaron la información de dependencia codificada en los encabezados de script de inicio LSB, o las utilizaron solo de manera muy limitada. Debido a que a menudo son incorrectos o incompletos. Sin embargo, systemd interpreta completamente estos encabezados y los sigue de cerca en el tiempo de ejecución

Creo que eso significa que mi script no funcionará hasta que se arregle.

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

40
2018-05-06 22:57


origen


"No quiero hacer lo correcto" te va a generar muchos comentarios negativos. Espero que te hayas puesto tu traje de materiales peligrosos. De todos modos, el camino de menor resistencia es nada; solo usa tu guión de inicio - Michael Hampton♦
Un día, seguramente, haré lo correcto. Pero vivimos en un mundo de recursos limitados. He agregado más detalles sobre lo que no funciona, ya que aparentemente se supone que esto ya funciona. - mlissner
¿Estás tratando de hacer esto en Ubuntu? Dios te ayude, ¿por qué? - Michael Hampton♦
Yo soy. ¿Es eso peor que en cualquier otro lugar? - mlissner
Entre todas las otras fallas de Ubuntu, la relevante aquí es que Upstart fue una pesadilla horrible. Es bueno que finalmente se deshagan de él, pero tu script de inicio como es No es realmente compatible con él. La forma en que funcionó antes es más probable a través de la compatibilidad (antigua) con SysV, y aunque systemd puede manejar esto, Ubuntu aparentemente ha hecho algo para romperlo. No recomendaré tratar de hacer que esto funcione, especialmente porque le habría costado mucho menos tiempo escribir el archivo de la unidad del sistema de lo que ya ha gastado en esto. - Michael Hampton♦


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 hacerte llegar alrededor del 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

Nota las cosas que no es Aquí, como el archivo de registro y tal; systemd capturará y registrará automáticamente la salida del servicio bajo el nombre del servicio.


27
2018-05-07 01:42



Bueno, esto me tomó más o menos todo el día para ser ajustado y configurado y todo. systemd tiene algunas rarezas, como este script no tendrá registros persistentes a menos que lo actives. Al final, está funcionando y tu empuje fue lo que necesitaba, gracias. - mlissner


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, ejecute sudo systemctl enable solr.


12
2018-03-18 06:57



Tiene un error tipográfico en su código que es el mismo que tenía y estaba impidiendo que mi script funcionara (obteniendo así el infame "contains no runlevels, aborting" error) hasta que me di cuenta: un tercer # faltante en tu segunda línea (debería ser ### BEGIN INIT INFO). Apuesto que eso también explicaría por qué tienes tan pocos votos, también. - Pere
Vaya, tienes razón, probablemente se eliminó en el proceso de copiar y pegar! (arreglado ahora) - eadmaster


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

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

7
2017-08-13 08:56



Él ya Intenté eso, y no funcionó, porque Ubuntu tiene errores. - Michael Hampton♦


Es más conveniente ejecutar Solr usando guión de inicio proporcionado.

El archivo de la unidad del sistema 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 EnvironmentFile al [Service] sección. La secuencia de comandos bin/solr Respeta las variables del entorno, solo echa un vistazo en él.


4
2017-09-01 07:41



Esto está bien hoy. En el momento en que se escribió originalmente la pregunta, no había una unidad de sistema proporcionada para Solr. - Michael Hampton♦


Probado en Debian: Agregue '_SYSTEMCTL_SKIP_REDIRECT = OHYES' al inicio del script.

A los fanáticos de Systemd puede que no les guste, pero hey, no me gusta systemd, así que ahí :).


1
2017-09-15 10:37



o SYSTEMCTL_SKIP_REDIRECT=true en redhat - Otheus
no funcionó para mí :( - eadmaster
Asegúrate de agregar _ (subrayado) antes SYSTEMCTL, Me gusta esto: _SYSTEMCTL_SKIP_REDIRECT=1. Si lo intentas desde la línea de comandos también necesitas exportar esa var. - timurb


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.


1
2017-11-15 07:52



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