Je souhaite démarrer un processus Java à l'aide de Upstart. Actuellement, sur nos serveurs OpenSuSE, j'utilise le système System V init pour y parvenir, mais sur nos serveurs Ubuntu, je préfère utiliser Upstart. Mais j'ai deux questions ...
J'ai un travail Upstart (une tâche) qui configure le serveur, appelé par exemple myconfig. Et dans le travail qui démarre mes Java processus, j’ai apparemment:
start on stopped myconfig
exec /path/to/myjavastartscript.sh
myjavastartscript.sh exécute 'Java -classpath blah MyClass'. Dans System V init, le démarrage du service exécute 'Nohup /path/to/myjavastartscript.sh &'.
Donc, ma première question est de savoir si je dois toujours faire le Nohup ou le run-in-background avec la commande exec?
Lors de son exécution, MyClass démarre les autres processus Java. Dans System V init, le service d'arrêt recherche uniquement les processus Java appartenant à un utilisateur donné et les tue. Ma deuxième question est de savoir comment puis-je contrôler la fin de ces processus avec Upstart?
Vous n'avez pas besoin d'utiliser Nohup
car, lorsque Upstart exécute un programme, ce processus ne sera pas associé à un terminal (par défaut).
Pour Upstart, je suggérerais soit de simplement appeler le travail:
exec Java -classpath blah MyClass
... ou en s'assurant que /path/to/myjavastartscript.sh appelle:
exec Java -classpath blah MyClass
Notez que le premier exec
ci-dessus est une strophe Upstart alors que le second est un mot-clé Shell. Si votre script Shell n'appelle pas la version Shell de exec
, vous devez veiller à définir correctement la strophe Upstart expect
- voir http: //upstart.ubuntu .com/cookbook/# expect .
En ce qui concerne l’arrêt du service, Upstart supprimera automatiquement le processus suivi (le processus principal JVM associé à MyClass
) et tous les enfants de ce processus (techniquement tout processus du même groupe de processus (voir http: //upstart.ubuntu.com/cookbook/#stopping-a-job )).
Sans plus de détails, je ne suis pas sûr que votre condition start on
convienne - vous voulez probablement que le travail MyClass démarre si et seulement si un fichier de configuration a été configuré? Si tel est le cas, l'idiome standard est que la strophe jobs pre-start
soit lue dans /etc/default/MyClass.conf
. S'il décide que le fichier n'existe pas ou que le fichier de configuration indique en quelque sorte que le service est désactivé/non configuré correctement, le pre-start
peut simplement appeler stop
pour arrêter le travail (complètement). démarrer (voir http://upstart.ubuntu.com/cookbook/#pre-start ). L’avantage de cette approche est que votre condition start on
peut ensuite être définie de manière fiable sur l’ensemble des conditions devant provoquer le démarrage du travail. Lorsque ces conditions sont remplies, Upstart exécutera le travail. le pré-démarrage s’exécutera, déterminera que la configuration n’est pas encore valide et simplement quitter. Le jour où l'administrateur décide de configurer le service, le travail commencera complètement.
Voir http://upstart.ubuntu.com/cookbook/#determining-the-start-on-condition-ubuntu-specific et http://upstart.ubuntu.com/cookbook/# ubuntu-well-connus-events-ubuntu-spécifique pour déterminer la condition start on
.
Notez enfin que vous devriez toujours toujours spécifier une condition stop on
. Voir http://upstart.ubuntu.com/cookbook/#stop-on .
J'ai eu le même problème, je voulais démarrer le serveur serviio dlna lors du démarrage de ma machine.
C'est mon /etc/init/serviio.conf
:
description "Start serviio DLNA server"
author "aanno"
start on net-device-up IFACE=eth0
stop on runlevel [!2345]
env enabled=1
setuid tpasch
setgid tpasch
#respawn the process if it crashes
respawn
env SERVIIO_HOME=/home/tpasch/serviio-1.0.1
script
[ "$enabled" = "1" ] || [ "$force_start" = "1" ] || exit 0
# Setup Serviio specific properties
Java_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dderby.system.home=$SERVIIO_HOME/library -Dserviio.home=$SERVIIO_HOME -Xmx512M -Xms20M -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20"
# construct classpath
cd $SERVIIO_HOME
CLASSPATH="config"
for i in lib/*.jar; do
CLASSPATH="$CLASSPATH:$i"
done
exec /usr/bin/Java $Java_OPTS -classpath $CLASSPATH org.serviio.MediaServer
end script