Nous commençons un processus Java avec la commande suivante:
/usr/bin/java -classpath /home/somejavadaemon/Java/classes:/home/somejavadaemon/Java/classes/mail.jar:/home/somejavadaemon/Java/classes/commons-logging-1.2.jar:/home/somejavadaemon/Java/classes/httpclient-4.5.2.jar:/home/somejavadaemon/Java/classes/httpcore-4.4.4.jar core.Main configFile=/home/somejavadaemon/Java/config.cfg
Lorsqu'il est lancé depuis le shell de l'utilisateur ( somejavadaemon
), tout va bien: le démon fonctionne et fait ce qu'il est censé faire.
Maintenant, nous voulons le faire à partir du fichier unité Systemd:
[Unit]
Description=somejavadaemon service
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
User=somejavadaemon
Group=somejavadaemon
Environment=JAVA_HOME=/usr/lib/jvm/java-8-oracle
Environment=J2SDKDIR=/usr/lib/jvm/java-8-oracle
Environment=DERBY_HOME=/usr/lib/jvm/java-8-oracle/db
Environment=J2REDIR=/usr/lib/jvm/java-8-oracle/jre
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin
ExecStart=/usr/bin/java -classpath /home/somejavadaemon/Java/classes:/home/somejavadaemon/Java/classes/mail.jar:/home/somejavadaemon/Java/classes/commons-logging-1.2.jar:/home/somejavadaemon/Java/classes/httpclient-4.5.2.jar:/home/somejavadaemon/Java/classes/httpcore-4.4.4.jar core.Main configFile=/home/somejavadaemon/Java/config.cfg
[Install]
WantedBy=multi-user.target
Par comptes de Systemd, le service démarre - le processus est en mémoire. Cependant, lorsque je regarde son statut, je vois ce qui suit:
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at whois.WhoisThreadPool$WhoisThread.start(WhoisThreadPool.java:319)
at whois.WhoisThreadPool.init(WhoisThreadPool.java:42)
at whois.WhoisThreadPool.<init>(WhoisThreadPool.java:36)
at whois.Whois.<init>(Whois.java:49)
at core.Main.main(Main.java:110)
Pourquoi cela se produit-il? En quoi le démarrage de Systemd est-il différent de celui du shell de l'utilisateur? C'est la même chose avec cron, nous avons essayé de le mettre là, avec le même succès.
-Xm*
paramètres qui contrôlent la taille de la mémoire de la machine virtuelle Java? Avez-vous essayé d'exécuter la commande dans un terminal en utilisant le même identifiant que celui démarré en tant que démon?