Eu criei meus próprios scripts de inicialização que usam variáveis:
#! /bin/sh
case "$1" in
start)
echo "Starting Public API"
sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/standalone.sh > ${PUBLICAPI_LOGGING_PATH} &
;;
stop)
echo "Stopping Public API"
sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $PUBLICAPI_PORT_OFFSET)) command=:shutdown > ${PUBLICAPI_LOGGING_PATH} &
;;
*)
echo "Usage: /etc/init.d/publicapi {start|stop}"
exit 1
;;
esac
exit 0
As variáveis são definidas em /etc/environment
e se parecem com:
PUBLICAPI_PORT_OFFSET=0
PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log
JBOSS_HOME_PUBLIC_API=/opt/publicapi
... e funcionam após o login, quando inicio e paro o script init manualmente, mas eles não funcionaram para os scripts init de inicialização (que são links simbólicos para /etc/init.d/publicapi
in /etc/rc2.d/
, /etc/rc5.d/
, /etc/rc6.d/
). A inicialização falha, porque as variáveis são desconhecidas.
Consegui corrigir isso executando o systemctl edit publicapi
que criou um arquivo /etc/systemd/system/publicapi.service.d/local.conf
que se parece com este depois de editado:
[Unit]
Description=Public API startup script
Documentation=no documentation
[Service]
Environment="JBOSS_HOME_PUBLIC_API=/opt/publicapi"
Environment="PUBLICAPI_PORT_OFFSET=0"
Environment="PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log"
quando eu reinicio, a inicialização do script init funciona. Mas agora estou com uma situação estranha: sempre preciso definir a variável tanto em /etc/systemd/system/publicapi.service.d/local.conf
quanto em /etc/environment
. Se eu omitir os de /etc/environment
, os scripts de inicialização init são executados, mas travam, porque as variáveis parecem não estar definidas (pelo menos após o login). se eu comentar as variáveis /etc/systemd/system/publicapi.service.d/local.conf
e defini-las /etc/environment
apenas, as variáveis são definidas após o login, mas os scripts de inicialização init não são executados. O que está acontecendo aqui? Qual é o escopo de /etc/systemd/system/publicapi.service.d/local.conf
(uma vez que os valores obviamente desaparecem após o login ou talvez não sejam definidos)? Como posso definir as variáveis apenas uma vez globalmente?
O que está acontecendo aqui é que você está escrevendo um script de inicialização do sistema V em um sistema que executa o systemd.
Seu systemd é um pouco compatível com versões anteriores e executará esses scripts de inicialização de estilo antigo em uma espécie de emulação, mas trate-os como systemd.
Acho que você vai se divertir mais abandonando seu antigo script init e escrevendo um novo serviço systemd. Dessa forma você não precisa
/etc/environment
.Aqui estão algumas leituras adicionais sobre como escrever serviços systemd.
Eu mesmo posso responder a pergunta agora. Depois de perder meio dia com essa porcaria de funileiro, consegui uma solução que funciona. Não há mais scripts init em /etc/init.d/ ou /etc/rcX.d) ou em qualquer outro lugar:
*)
/etc/environment
*) em
/home/techops
crie um scriptconsent-server
com este conteúdo:*) Crie um arquivo
/etc/systemd/system/consent-server.service
com este conteúdo:*) Ativar serviço (irá criar um link simbólico):
Após a reinicialização, o serviço é iniciado automaticamente e todas as variáveis são reconhecidas. Você também pode iniciar e parar o serviço com systemctl start consent-server systemctl stop consent-server