Qual è il modo più semplice per far funzionare il mio vecchio script init in systemd?


48

Non voglio fare la cosa giusta creando un nuovo script systemd, voglio solo che il mio vecchio script init funzioni di nuovo ora che ho aggiornato il mio sistema a un sistema operativo che utilizza systemd.

Ho studiato brevemente come convertire gli script di init e come scrivere script di systemd, ma sono sicuro che impararlo correttamente e farlo nel modo giusto mi richiederebbe diverse ore.

La situazione attuale è:

systemctl start solr
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

E:

sudo service solr start
Failed to start solr.service: Unit solr.service failed to load: No such file or directory.

In questo momento, voglio solo tornare al lavoro. Qual è il percorso di minor resistenza per far funzionare di nuovo questo?

aggiornamenti

Non volevo capire tutto - non l'ho fatto davvero - ma devo e ho scoperto il mio primo indizio:

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 pagina delle incompatibilità per systemd dice che:

Le informazioni sulla dipendenza dell'intestazione LSB sono importanti. Le implementazioni SysV su molte distribuzioni non hanno utilizzato le informazioni sulle dipendenze codificate nelle intestazioni degli script init LSB, né le hanno utilizzate solo in modi molto limitati. A causa di ciò sono spesso errati o incompleti. systemd tuttavia interpreta completamente queste intestazioni e le segue da vicino in fase di esecuzione

Penso che ciò significhi che il mio script non funzionerà fino a quando non verrà risolto.

La sceneggiatura in questione:

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

"Non voglio fare la cosa giusta" ti darà molti feedback negativi. Spero che tu abbia indossato la tua tuta ignifuga. Comunque, il percorso di minor resistenza non è nulla ; usa il tuo script init.
Michael Hampton

6
Un giorno, sicuramente, farò la cosa giusta. Ma viviamo in un mondo di risorse limitate. Ho aggiunto ulteriori dettagli su ciò che non funziona, dal momento che apparentemente dovrebbe funzionare già.
mlissner,

Stai provando a farlo su Ubuntu? Dio ti aiuti, perché?
Michael Hampton

1
Sono. È peggio che altrove?
mlissner

1
Tra tutti gli altri fallimenti di Ubuntu, quello rilevante qui è che Upstart è stato un incubo divino. È bello che alla fine si stiano sbarazzando di esso, ma il tuo script init così com'è non è davvero compatibile con esso. Il modo in cui ha funzionato prima è molto probabilmente attraverso la (antica) compatibilità SysV, e mentre systemd è in grado di gestirlo, Ubuntu sembra aver fatto qualcosa per romperlo. Non consiglierò di provare a farlo funzionare, soprattutto perché ci sarebbe voluto molto meno tempo per scrivere il file di unità di sistema di quanto tu abbia già speso per questo.
Michael Hampton

Risposte:


34

Scherzi a parte, un file di unità systemd è banale da scrivere per un servizio come questo ... o per la maggior parte dei servizi.

Questo dovrebbe farti arrivare circa il 95% del percorso. Inseriscilo, ad esempio,/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 le cose che non sono qui, come il file di registro e simili; systemd acquisirà e registrerà automaticamente l'output del servizio con il nome del servizio.


5
Bene, questo mi ha richiesto più o meno tutto il giorno per essere ottimizzato e configurato e tutto il resto. systemdha alcune stranezze, come questo script non avrà registri persistenti a meno che non lo attivi. Alla fine, però, funziona e la tua spinta è stata ciò di cui avevo bisogno, grazie.
mlissner

15

Per me è stato più semplice aggiungere il blocco info init nell'intestazione come suggerito qui :

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

Quindi, esegui sudo systemctl enable solr.


1
Hai un refuso nel tuo codice che sembra essere lo stesso che avevo e impediva al mio script di funzionare (ottenendo così il famigerato "contains no runlevels, aborting"errore) fino a quando non me ne sono reso conto: un terzo # mancante nella tua seconda riga (dovrebbe essere ### BEGIN INIT INFO). Scommetto che spiegherebbe anche perché anche tu hai così pochi voti.
Pere,

1
oops, hai ragione, probabilmente è stato rimosso nel processo di copia-incolla! (risolto ora)
eadmaster

7

Un'altra soluzione per utilizzare lo script init legacy solr con systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  

1
Ci ha già provato e non ha funzionato, perché Ubuntu è difettoso.
Michael Hampton

4

È più conveniente eseguire Solr utilizzando lo script iniziale fornito .

Il file di unità di systemd è simile al seguente:

[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

Nota che puoi anche utilizzare le variabili di ambiente aggiungendole EnvironmentFilealla [Service]sezione. Lo script bin/solrrispetta le variabili di ambiente, basta dare un'occhiata in esso.


Questo va bene oggi. All'epoca in cui la domanda era stata originariamente scritta, non esisteva un'unità di sistema fornita per Solr.
Michael Hampton

1

Testato su Debian: aggiungi '_SYSTEMCTL_SKIP_REDIRECT = OHYES' all'inizio dello script.

Ai fan di Systemd potrebbe non piacere ma hey, non mi piace systemd, quindi lì :).


o SYSTEMCTL_SKIP_REDIRECT=truein redhat
Otheus

non ha funzionato per me :(
eadmaster il

Assicurati di aggiungere _(sottolineatura) prima SYSTEMCTL, in questo modo: _SYSTEMCTL_SKIP_REDIRECT=1. Se lo provi dalla riga di comando, devi anche esportare quella var.
timurb

1

Ho avuto lo stesso errore durante il tentativo di utilizzare uno script init LSB su CentOS 7. La causa principale è risultata essere che lo script era un collegamento simbolico. Una volta sostituito con una copia dell'originale, tutto ha funzionato bene.


Questo potrebbe essere stato il caso anche per la mia sceneggiatura.
mlissner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.