Qual é a maneira mais fácil de fazer meu antigo script init funcionar no systemd?

48

Não quero fazer a coisa certa criando um novo script systemd, só quero que meu antigo script init funcione novamente agora que atualizei meu sistema para um sistema operacional que usa systemd.

Eu pesquisei brevemente como converter scripts init e como escrever scripts systemd, mas tenho certeza de que aprendê-lo corretamente e fazer o que é correto levaria várias horas.

A situação atual é:

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.

Agora, eu só quero voltar ao trabalho. Qual é o caminho de menor resistência para fazer isso funcionar novamente?

Atualizações

Eu não queria entender tudo - realmente não -, mas tenho que descobrir e descobri minha primeira 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.

A página de incompatibilidades para systemd diz que:

As informações de dependência do cabeçalho LSB são importantes. As implementações do SysV em muitas distribuições não usavam as informações de dependência codificadas nos cabeçalhos de script init LSB, ou as usavam apenas de maneiras muito limitadas. Devido a isso, eles geralmente estão incorretos ou incompletos. No entanto, o systemd interpreta completamente esses cabeçalhos e os segue de perto no tempo de execução

Acho que isso significa que meu script não funcionará até que seja corrigido.

O script em questão:

#!/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
fonte
"Eu não quero fazer a coisa certa" vai receber muito feedback negativo. Espero que você tenha vestido seu traje de proteção. De qualquer forma, o caminho de menor resistência não é nada ; basta usar seu script init.
Michael Hampton
6
Um dia, certamente, farei a coisa certa. Mas vivemos em um mundo de recursos limitados. Eu adicionei mais detalhes sobre o que não está funcionando, pois aparentemente isso já deve funcionar.
Mlissner
Você está tentando fazer isso no Ubuntu? Deus te ajude, por que?
Michael Hampton
1
Eu sou. Isso é pior do que em qualquer outro lugar?
Mlissner
1
Entre todas as outras falhas do Ubuntu, a relevante aqui é que o Upstart foi um pesadelo. Bom é que eles estão finalmente se livrar dele, mas seu script de init como é realmente não é compatível com ele. O modo como funcionou antes é provavelmente através da (antiga) compatibilidade com SysV e, embora o systemd possa lidar com isso, o Ubuntu aparentemente fez algo para quebrá-lo. Não recomendo tentar fazer isso funcionar, especialmente porque levaria muito menos tempo para gravar o arquivo da unidade systemd do que você já gastou.
Michael Hampton

Respostas:

34

Sério, um arquivo de unidade systemd é trivial para escrever para um serviço como este ... ou para a maioria dos serviços.

Isso deve levá-lo a cerca de 95% do caminho até lá. Coloque isso, por exemplo,/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

Observe as coisas que não estão aqui, como o arquivo de log e outras coisas; O systemd capturará e registrará automaticamente a saída do serviço com o nome do serviço.

Michael Hampton
fonte
5
Bem, isso me levou mais ou menos o dia todo para ser aprimorado e configurado e tudo mais. systemdtem algumas esquisitices, como esse script não terá logs persistentes, a menos que você o ative. No final, está funcionando e seu esforço foi o que eu precisava, obrigado.
Mlissner
15

Para mim, foi mais fácil adicionar o bloco de informações init no cabeçalho, como sugerido aqui :

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

Então, execute sudo systemctl enable solr.

eadmaster
fonte
1
Você tem um erro de digitação no código que é o mesmo que eu tinha e estava impedindo que meu script funcionasse (obtendo o "contains no runlevels, aborting"erro infame ) até que eu percebi: um terceiro # ausente na sua segunda linha (deveria ser ### BEGIN INIT INFO). Aposto que isso também explicaria por que você tem tão pouco voto.
Pere
1
oops, você está certo, provavelmente foi removido no processo de copiar e colar! (corrigido agora)
eadmaster 29/03
7

Outra solução para usar o script init do solr legacy com systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
véspera do Gregory
fonte
1
Ele tentou isso e não funcionou, porque o Ubuntu é de buggy.
Michael Hampton
4

É mais conveniente executar o Solr usando o script de início fornecido .

O arquivo da unidade systemd se parece com o seguinte:

[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

Observe que você também pode fazer uso de suas variáveis ​​de ambiente adicionando EnvironmentFileà [Service]seção O script bin/solrrespeita as variáveis ​​de ambiente, basta dar uma olhada nele.

Jiří Kozlovský
fonte
Está tudo bem hoje. No momento em que a pergunta foi originalmente escrita, não havia uma unidade systemd fornecida para o Solr.
Michael Hampton
1

Testado no Debian: Adicione '_SYSTEMCTL_SKIP_REDIRECT = OHYES' no início do script.

Os fanáticos do Systemd podem não gostar, mas ei, eu não gosto do systemd, então não há :).

Guy Egozy
fonte
ou SYSTEMCTL_SKIP_REDIRECT=trueem redhat
Otheus 04/10
não funcionou para mim :(
eadmaster 18/0317
Certifique-se de adicionar _(underscore) antes SYSTEMCTL, como este: _SYSTEMCTL_SKIP_REDIRECT=1. Se você tentar isso na linha de comando, também precisará exportar essa var.
timurb 29/11
1

Eu tive o mesmo erro ao tentar usar um script de inicialização LSB no CentOS 7. A causa principal acabou sendo o script como um link simbólico. Uma vez substituído por uma cópia do original, tudo funcionou bem.

gatopeich
fonte
Esse também poderia ter sido o caso do meu script.
mlissner