configurare il demone java con systemd


11

Sto usando questa definizione per un systemdlavoro:

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

Lo script viene chiamato come segue (chiamando una semplice routine che ascolta su un socket tcpip e accoda l'input a un file):

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

Dopo che il systemctl start somejobprocesso viene visualizzato come in esecuzione, con initcome padre:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

Dopo aver eseguito systemctl stop somejobil processo non viene più visualizzato (e la porta è chiusa).

Quindi tutto sembra a posto e dandy

La mia domanda è: è una soluzione accettabile per eseguire un demone Java con systemd, o ci sono avvertenze, e quindi altri modi più stabili o sicuri per raggiungere questo obiettivo?

Risposte:


14

Ecco alcune piccole modifiche:

  1. Dal momento che è in ascolto su un socket di rete, renderlo una dipendenza di network.target.
  2. nohupnon è necessario poiché systemddemonizza l'eseguibile per te.
  3. Penso che uno script di shell separato sarebbe eccessivo, quindi uniscilo nel file di servizio.
  4. Il reindirizzamento ( < /dev/nulle così via) non è necessario poiché systemd imposta un contesto I / O standard appropriato. Infatti, se si prende il reindirizzamento out systemd registrerà qualsiasi cosa inviata allo standard output dal programma Java nel suo journal, senza che sia necessario alcun meccanismo di registrazione speciale.
  5. L'esecuzione in modo asincrono dalla shell che invoca ( &) non è necessaria o appropriata.
  6. C'è un modello di comportamento specifico richiesto da Type=forking, e se non è seguito dal demone le cose vanno male. Quindi prova per Type=simple(o Type=notify).

Quindi il file di servizio è simile al seguente:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

Appunti:

  1. Non puoi semplicemente usare javacome nome del programma da eseguire. systemd non cerca gli PATHeseguibili e il nome dell'eseguibile dato ExecStartdeve essere assoluto. Quindi, se si desidera la ricerca del percorso, è necessario richiamare tramite una shell o /usr/bin/env. Scegliamo /bin/shqui
  2. Poiché questa è Type=simplela shell deve essere execJava, non eseguirla come un processo figlio. systemd controlla il servizio attraverso il processo principale e deve essere Java, non un processo shell genitore.
  3. Poiché ciò non sta richiamando direttamente l'eseguibile Java, systemd inserirà il nome shnel suo journal come nome del servizio. Vedi Come evitare / usr / bin / env essere marcato nei log di systemd come eseguibile per ulteriori informazioni al riguardo.

Per quanto ne so, non esiste un avvertimento speciale per l'esecuzione dell'applicazione Java con Systemd.


1
Non funzionerà Problema 1: questa non è la shell; non ci sono operatori di reindirizzamento. Non vuoi davvero quel reindirizzamento comunque. Problema 2: ExecStart richiede nomi di percorso assoluti. Problema 3: unix.stackexchange.com/questions/229523
JdeBP

Bello testa in su. Posso solo risolvere il problema 1. Come risolvi Prob 2,3?
Yun-Chih Chen,

1
Vedi la risposta modificata.
JdeBP,

Non penso che lo sh sia necessario qui.
Faho,

Ciao @ Yun-ChihChen come si interrompe il processo. Come sarebbe ExecStrop? Ho usato init.d insieme a un file pid ma ho trovato questo più facile. Quindi dovevo assicurarmi di sapere come fermarmi, ecc. Grazie
sensei nero,
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.