Desconhecido lvalue 'Após network.target' na seção 'Unit' Centos 7

0

Eu modifiquei os arquivos da unidade de acordo com sua postagem:

[Unit]
Description=My Portal Service
After=network.target

[Service]
SyslogIdentifier=my-portal
Environment=SERVICE_NAME=my-portal
Environment=PATH_TO_TARGET=/opt/apps/egp/stage/my-portal/target
ExecStart=/usr/bin/env java -jar ${PATH_TO_TARGET}/${SERVICE_NAME}.jar server ${PATH_TO_TARGET}/${SERVICE_NAME}.yml

[Install]
WantedBy=multi-user.target

Eu também executo o comando:

systemctl daemon-reload

para recarregar a configuração do gerenciador do systemd.

Tudo está funcionando bem - posso iniciar, parar e ver o status do serviço com êxito usando:

 systemctl start my-portal
 systemctl status my-portal -l
 systemctl stop my-portal

E depois de corrigir o problema com as variáveis de env do Java - eu executarei este comando:

systemctl enable service-name

para iniciar o serviço (serviços - 5 no total) durante a inicialização.

O problema que tenho é definir variáveis de env Java. Eu tentei várias versões: adicionando-as em .bash_profile e usando o comando source e, em seguida, escrevendo Java env no arquivo javaenv.sh separado na pasta /etc/profile.d:

export JAVA_HOME=/opt/jdk1.7.0_80
export PATH=/opt/jdk1.7.0_80/bin:$PATH

Deu permissão:

chmod +x /etc/profile.d/javaenv.sh

e arquivo de unidade modificado adicionando $ {JAVA_HOME} / bin na linha ExecStart ... Não está encontrando Java. Eu tive o mesmo problema antes, quando eu estava usando scripts sh recebendo o erro:

nohup: failed to run command ‘java’: No such file or directory  

Eu li muitos posts sobre esse assunto - mas não consigo encontrar a solução para definir variáveis Java em um lugar e usá-las em outras unidades ou arquivos de script como variáveis $ {JAVA_HOME}.

Onde definir variáveis de env Java para serem usadas em vários lugares permanentemente sem registro?

    
por ganna07 31.03.2018 / 19:42

2 respostas

3

.INI noções básicas de sintaxe de arquivos

[Unit]
Description = My Portal Service
After network.target = my-portal.service

Na seção Unit , a chave deve ser After e o valor é (por exemplo) network.target my-portal.service . Você tem uma chave de After network.target e um valor my-portal.service . Essa chave não significa nada para o sistema, como a mensagem lhe disse.

Outright systemd Casa do Horror coisas

Fazer um serviço ordenado para iniciar após ele mesmo é ridículo. Mas isso é apenas a ponta do iceberg aqui.

Type = forking
ExecStart = /usr/local/bin/my-portal.sh start
ExecStop = /usr/local/bin/my-portal.sh stop
ExecReload = /usr/local/bin/my-portal.sh reload
…
PATH_TO_LOG="/var/log/egp"
…
PID_PATH_NAME=/var/run/${SERVICE_NAME}-pid
nohup … >> ${PATH_TO_LOG}/${SERVICE_NAME}.out 2>&1&

Tudo isso é apenas o padrão clássico, estranhamente predominante com Java, de erguer uma confusão tola de andaimes totalmente desnecessários e errôneos.

Você não precisa do script de shell . Você certamente não precisa do mecanismo de arquivo PID instável e perigoso que ele tenta empregar. Nem você precisa de um mecanismo de registro manual que dependa de um mecanismo logrotate / newsyslog frágil, e não pode impedir que o volume do seu disco seja preenchido com a saída de log (gravado por um processo com privilégios de superusuário; espaço de disco de emergência reservado) em muitos casos.

Use os recursos do gerenciador de serviços que existem:

#/etc/systemd/system/my-portal.service
[Unit]
Description=My Portal Service
Documentation=https://unix.stackexchange.com/a/434726/5132
After=network.target

[Service]
SyslogIdentifier=my-service
Environment=SERVICE_NAME=my-service
Environment=PATH_TO_TARGET="/opt/apps/egp/stage/my-service/target"
ExecStart=/usr/bin/env java -jar ${PATH_TO_TARGET}/${SERVICE_NAME}.jar server ${PATH_TO_TARGET}/${SERVICE_NAME}.yml

[Install]
WantedBy=multi-user.target

Para ler o log do serviço, use apenas journalctl da maneira usual. Um gerenciador de serviços rastreia processos lembrando seus IDs de processo de quando gerou-os e não precisa do mecanismo de arquivos PID frágil e perigoso.

Leitura adicional

por 31.03.2018 / 21:03
1

Você perdeu um caractere de igual em my-portal.service . Além disso, você deve se livrar do script de shell e obter o SystemD para gerenciar o processo diretamente.

Tente isto:

[Unit]
Description=My Portal Service
After=network.target

[Service]
Type=Simple
ExecStart=/usr/bin/java -jar /opt/apps/egp/stage/my-portal/target/my-portal.jar server /opt/apps/egp/stage/my-portal/target/my-portal.yml

[Install]
WantedBy=multi-user.target
    
por 31.03.2018 / 21:07