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

43

Eu não quero fazer a coisa certa criando um novo script systemd, eu só quero que meu antigo script de init funcione novamente agora que eu atualizei meu sistema para um sistema operacional que está usando o systemd.

Eu pesquisei brevemente como converter scripts de init e como escrever scripts do systemd, mas tenho certeza que aprendê-lo apropriadamente e fazer isso da maneira correta me 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, só quero voltar ao trabalho. Qual é o caminho da menor resistência para que isso funcione novamente?

Atualizações

Eu não queria descobrir tudo isso - eu realmente não queria - mas preciso fazer isso e descobri meu primeiro indício:

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 do systemd diz que:

LSB header dependency information matters. The SysV implementations on many distributions did not use the dependency information encoded in LSB init script headers, or used them only in very limited ways. Due to that they are often incorrect or incomplete. systemd however fully interprets these headers and follows them closely at runtime

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
    
por mlissner 07.05.2015 / 00:57

6 respostas

28

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

Isso deve levar cerca de 95% do caminho até lá. Coloque isso em, 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 são aqui, como o arquivo de log e tal; O systemd irá capturar e registrar automaticamente a saída do serviço sob o nome do serviço.

    
por 07.05.2015 / 03:42
12

Para mim, foi mais fácil adicionar o bloco de informações do init no cabeçalho, conforme 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

Em seguida, execute sudo systemctl enable solr .

    
por 18.03.2017 / 07:57
7

Outra solução para usar o script de init legado solr com o systemd:

systemctl daemon-reload  
systemctl enable solr  
systemctl start solr  
    
por 13.08.2015 / 10:56
4

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

O arquivo de unidade do systemd se parece com isto:

[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 usar suas variáveis de ambiente adicionando EnvironmentFile à seção [Service] . O script bin/solr respeita as variáveis de ambiente, basta dar uma olhada nele.

    
por 01.09.2017 / 09:41
1

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

Os fanboys do Systemd podem não gostar, mas ei, eu não gosto do systemd, então lá :).

    
por 15.09.2016 / 12:37
1

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

    
por 15.11.2016 / 08:52