Comment faire fonctionner un fichier jar au démarrage et quand vous vous déconnectez?

30

Je ne sais pas par où commencer. J'ai lu sur les démons et je n'ai pas compris le concept.

Plus de détails :

  • J'ai écrit un robot qui ne s'arrête jamais et des robots sur RSS sur Internet.
  • Le robot a été écrit en java - c'est donc un pot en ce moment.
  • Je suis administrateur sur une machine dotée d'Ubuntu 11.04.
  • Il y a quelques chances que la machine plante, donc j'aimerais que le robot s'exécute à chaque démarrage de la machine.
  • De plus, j'aimerais qu'il continue de fonctionner même lorsque je me suis déconnecté. Je ne suis pas sûr que ce soit possible, mais la plupart du temps je suis déconnecté et je veux toujours l'explorer.

Des idées? Quelqu'un peut me diriger dans la bonne direction?

Je cherche juste la solution la plus simple.

RanZilber
la source

Réponses:

32

Voici un moyen simple de le faire en utilisant SysVInit. Instructions:

  1. Créez le script de démarrage et d'arrêt de votre application. Mettez-le sur un répertoire, dans notre exemple est:

    • Démarrer le script: /usr/local/bin/myapp-start.sh
    • Arrêter le script: /usr/local/bin/myapp-stop.sh

    Chacun fournira les instructions pour exécuter / arrêter l'application. Par exemple, le myapp-start.shcontenu peut être aussi simple que ce qui suit:

    #!/bin/bash
    
    java -jar myapp.jar 

    Pour le script d'arrêt, cela peut être quelque chose comme ceci:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
  2. Créez le script suivant ( myscript) et mettez-le /etc/init.d.

    /etc/init.d/myscript contenu:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
  3. Mettez le script pour commencer avec le système (en utilisant SysV). Exécutez simplement la commande suivante (en tant que root ):

    update-rc.d myscript defaults 

PS: Je sais que Upstart est génial et bla bla, mais je préfère l'ancien système d'initialisation SysV.

Marcos Roriz Junior
la source
1
Mais comment le système saura-t-il quel paramètre utilisera? Comment définir pour être le «début». J'ai essayé ici et cela n'a pas fonctionné.
John John Pichler
1
Cela fonctionne, mais la commande "service myapp start" ne quitte pas la commande.
Tobia
Maintenant, comment utiliser les options start | stop | restart dans myscript?
Codevalley
De plus, même après avoir fait les 3 étapes, mon pot ne fonctionne pas au démarrage. Êtes-vous sûr si nous devons changer les autorisations, le chemin ou quelque chose comme ça?
Codevalley
@Codevalley, comme je l'ai mentionné, cette méthode est pour l'init SysV. Pour utiliser le service ou une autre commande, vous devrez écrire un travail parvenu. Mais si vous allez faire cela, vous devriez en écrire un système (car il devient la norme)
Marcos Roriz Junior
6

Oui! C'est possible. :) Upstart est le chemin à parcourir pour s'assurer que le service continue de fonctionner. Il dispose de cinq packages, tous installés par défaut:

  • Démarrez l'initialisation et l'utilitaire initctl
  • upstart-logd fournit le démon logd et le fichier de définition de travail pour le service logd
  • upstart-compat-sysv fournit des fichiers de définition de travail pour les tâches rc et les outils de redémarrage, niveau d'exécution, arrêt et telinit qui assurent la compatibilité avec SysVinit
  • startup-tasks fournit des fichiers de définition de travail pour les tâches de démarrage du système
  • system-services fournit des fichiers de définition de travail pour les services tty

L'apprentissage est très agréable et en vaut la peine. Upstart a un site Web: http://upstart.ubuntu.com/


la source
Depuis le site Web Upstart, à partir de 2019: "Le projet est en mode maintenance uniquement. Aucune nouvelle fonctionnalité n'est en cours de développement et le conseil général serait de passer à un autre système d'initialisation minimal ou systemd"
Nav
2

3 suggestions rapides ...

  1. Créez un script S tart dans /etc/rc3.d(mode console multi-utilisateur) avec les scripts K ill correspondants dans /etc/rc.0et /etc/rc6.dpour tuer votre programme Java de manière contrôlée lorsque le système s'éteint (niveau d'exécution 0) ou redémarre (niveau d'exécution 6) Voir une introduction aux niveaux d'exécution .

    Vous pourrez peut-être démarrer votre application Java au niveau d'exécution 2 (rc2.d) mais, en tant que robot d'exploration, elle aura besoin de TCP / IP. Assurez-vous donc que votre service de mise en réseau est disponible / démarré au préalable dans votre niveau d'exécution 2. Le réseautage est définitivement au niveau d'exécution 3.

    /etc/init.dcontient tous les scripts de démarrage / arrêt réels. /etc/rcN.dles répertoires contiennent juste des liens vers eux, préfixés par S ou K pour les démarrer ou les tuer respectivement, par niveau d'exécution N.

  2. Un processus exécuté par cronddoit persister entre les déconnexions. Peut-être l'ajouter à votre crontab.

  3. Un processus exécuté avec nohupdoit également persister. Voir nohup: exécutez une commande même après votre déconnexion .

    $ nohup java -jar myapp.jar &

    Par défaut, myapp.jarla sortie standard de va dans un fichier nommé ./nohup.out, ou $HOME/nohup.outsi le premier n'est pas accessible en écriture.


la source
Et quand je me déconnecte, cela fonctionnera-t-il toujours en arrière-plan?
RanZilber
0

Soyez également conscient lorsque vous faites des applications avec:

  update-rc.d myscript defaults 

Pour avoir les autorisations 0755 et pour utiliser ou obtenir avant votre .sh le chemin. Supposons que votre script se trouve sur /root/test.sh, vous devez d'abord changer de CD /root/avant d'accéder test.sh.

La meilleure façon est donc de faire un SH sur init.d et de changer le chemin vers votre shet de l'exécuter dans la fonction de démarrage.

Şήøωў
la source