Exécuter un alias au démarrage

Bonjour,
Tout est dans le titre: comment faire pour exécuter un alias linux au démarrage de la machine.
Merci d'avance,
Vivelesgrecs

7 réponses

Résumé de la discussion

Exécuter un alias Linux au démarrage et lancer automatiquement un serveur Java sont discutés, avec des approches allant du script rc.local à l’usage de services systemd ou init.d. Il est conseillé d’éviter les alias dans les scripts de démarrage et de privilégier des commandes non aliasées, via rc.local, init.d ou un service systemd, avec chemins absolus. Des solutions alternatives évoquent l’usage de screen ou la mise en service du serveur comme démon, afin que le processus survive à une déconnexion ou à un redémarrage. En pratique, l’usage de journaux système et de chemins explicites aide à diagnostiquer les erreurs et à garantir que le démarrage automatique respecte l’environnement du script.

Bobot (l’IA à votre service)
  1. Modérateur
    voici mon fichier:
    cd && cd mc-server && sudo screen java -Xms512M -Xmx1024M -XX:MaxPermSize=128M $=128M -jar spigot.jar nogui


    Si l'idée est de lancé un service, plutôt que d'écrire dans /etc/rc.local, il serait plus propre de créer un service. Tu peux par exemple repartir de
    https://forums.commentcamarche.net/forum/affich-25769449-minecraft-serveur#1

    j'ai mis ma ligne de commande dans rc.local, j'ai exécuté le fichier, tout marche.
    mas si j’éteins la machine, le processus (qui est un screen) n'apparait pas après la commande screen -r et le serveur est inaccessible.


    Alors soit j'ai mal compris, soit tu n'as pas bien compris ce que fait la commande screen.

    La commande
    screen
    permet de lancer une application en l'associant à un screen, puis de la "récupérer" par la suite avec la commande
    screen
    .

    Par exemple, supposons que tu es à la maison et tu veux lancer un calculer sur un serveur au travail, tu vas te connecter à ce serveur. Si tu lances ton calcul sans screen, dès que tu te déconnectes (depuis la maison) de ce serveur, le calcul va s'arrêter. Pourquoi ? Parce qu'en te déconnectant, tu vas également tuer le processus (typiquement un shell) qui t'a permis de lancer le calcul, et donc le programme de calcul aussi.

    C'est là que
    screen
    intervient. Tu te connectes à ton serveur, tu lances un screen, puis ton calcul dedans. Au moment où tu te déconnectes, le screen reste en vie et donc la calcul aussi.

    Toutefois, cela suppose que le serveur continue à être allumer pour faire ses calculs ! Si tu éteins le serveur, il tue tous ses processus, ce qui inclue les éventuels screens et les processus qui y sont attachés.

    Du coup quand tu dis que lorsque tu éteins ta machine, ton programme devient inaccessible, eh bien c'est tout à fait normal, et le screen n'y changera rien.

    Bonne chance
    2
    1. non, je voulais dire si j’éteins et je rallume
      0
    2. Contributeur
      @vivelesgrecsSi tu éteins et que tu rallumes quoi ?
      0
    3. je suis d'accord, je dis juste que je lance mon serveur depuis un autre ordi connecté en ssh. je romps après la connexion, donc j'ai besoin d'un screen.je voudrais juste que si il y ai une coupure de courant, le serveur se rallume automatiquement. je précise que le Raspberry n'a pas de bouton on off donc tant qu'il est branché il marche et si on l’éteint il faut le débrancher et le rebrancher pour le rallumer.zipe31 si j’éteins et je rallume le pc qui héberge ( le Raspberry).
      0
    4. Modérateur
      donc j'ai besoin d'un screen

      Pas si tu lances ton programme comme un démon au travers d'un service. C'est par exemple de cette manière qu'un serveur ssh fonctionne.

      je voudrais juste que si il y ai une coupure de courant, le serveur se rallume automatiquement.

      S'il y a une coupure de courant et que le service est dans la chaîne de démarrage, comme indiqué dans le lien :
      https://forums.commentcamarche.net/forum/affich-25769449-minecraft-serveur#1

      ... ton serveur sera lancé au démarrage (au même titre que ssh).

      Bonne chance
      0
    5. Bonjour maximiendo et désolé de revenir un peu tard.
      J'ai suivi le lien que tu m'as donné en remplacant bien tout les chemins de fichiers et en les remplaçants par le chemin des miens, je fait un reload daemon mais su je lance le service,il ne se passe rien...
      Merci d'avance,
      Vivelesgrecs
      0
  2. Modérateur
    Bonjour,

    Réponse courte

    C'est une mauvaise idée de définir un alias dans un script shell, mieux vaut écrire la commande non aliasés.

    Réponse détaillée

    Disons que tu parles de deux choses qui sont indépendants :
    - un alias est une manière de nommer une commande
    - ensuite lancer une script au démarrage c'est vague : au démarrage de linux ?

    Donc typiquement sous debian écrire dans /etc/rc.local permet de lancer des tâches au démarrage. Dedans tu écris un script shell, et tu finis par un
    exit 0
    . Ensuite j'imagine que rien n'empêche de définir un alias (même si ça ne se fait pas) et de l'utiliser dans ton script.

    Typiquement ce script :

    alias coucou="echo bonjour"
    coucou


    ... quand il est lancé, écrit bien "bonjour".

    Conclusion : c'est faisable !

    Mais il faut s'assurer que le shell qui invoque ton script au lancement (/etc/rc.local) est bien du bash (ou un shell qui comprend la directive "alias"), ce qui n'est pas garanti dans le cas général. C'est d'ailleurs pour ça qu'en général on évite les alias dans les scripts shell.

    La bonne nouvelle en tout cas, c'est que l'alias n'est pas maintenu (exporté) à la sortie du script.

    Bonne chance
    1
    1. Modérateur
      Tu recopies simplement ton script dans /etc/rc.local. Tu peux ensuite le tester en lançant la commande :

      /etc/rc.local


      Bonne chance
      1
      1. merci beaucoup,
        dans mon fichier rc.local, je met quoi ?(en dehors de la commande) car il est vide.
        ensuite, le script shell, je le met ou ?
        merci d'avance.
        0
        1. Bonjour,
          tu peut aussi toute automatiser lors du démarrage de ta machine,

          En ajoutant la commande pour démarrer ton script dans le fichier .profiles
          de ton profiles :p

          voila

          cordialement
          Roche Corentin
          0
          1. Modérateur
            Bonjour Corentin,

            Merci pour ta réponse, mais attention il faut distinguer deux choses :
            -
            /etc/profile
            est lu au démarrage d'un shell (d'un terminal)
            -
            /etc/rc.local
            est lu au démarrage de la même machine

            Ils n'agissent donc pas au même moment. En ce sens,
            /etc/profile
            ne répond pour moi pas à la question initialement posée.
            0
          2. Ha oui effectivement, j'ai l'habitude de pas avoir d'interface graphique donc je passe forcement au démarrage du shell ..

            Merci pour l'info :p
            0
        2. merci a tous pour vos réponses.
          pour resumer, je doit donc mettre ma commande dans etc/init.d/rc.local ou dans ke fichier. profile.(je dit commande ca mon fichier shell se compose juste d'une commande).
          merci encore
          vivelesgrecs

          --
          0
          1. dans LE fichier
            je dit commande CAR
            dsl

            --
            0
          2. Oui normalement cela devrai marcher :p

            bonne chance
            0
          3. bonjour,
            j'ai mis ma ligne de commande dans rc.local, j'ai exécuté le fichier, tout marche.
            mas si j’éteins la machine, le processus (qui est un screen) n'apparait pas après la commande screen -r et le serveur est inaccessible.
            voici mon fichier:
            cd && cd mc-server && sudo screen java -Xms512M -Xmx1024M -XX:MaxPermSize=128M $=128M -jar spigot.jar nogui

            merci d'avance,
            vivelesgrecs
            0
          4. Sinon crée un script ou tu a les ligne de commande et lance le manuellement si jamais le server se ferme, tu sera obliger de le re-lancer a la main je pense :p

            cdl
            0
        3. Bonjour mamiemando,
          J'ai supprimé le cd mc-server puisque que je précise déjà le chemin du fichier qui est /home/minecraft/mc-server /spigot.jar.
          J'ai également enlevé le sudo mais pas le screen puisque j'ai besoin de pouvoir récupérer le terminal du serveur.
          sudo journalctl -xn donne ceci :

          -- Logs begin at lun. 2017-04-03 11:54:28 UTC, end at lun. 2017-04-03 17:07:26 UTC
          avril 03 17:07:23 raspberrypi systemd[1]: Starting LSB: minecraft server Descripti
          -- Subject: L'unité (unit) minecraft.service a commencé à démarrer
          -- Defined-By: systemd
          -- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
          --
          -- L'unité (unit) minecraft.service a commencé à démarrer.
          avril 03 17:07:23 raspberrypi minecraft[11708]: /etc/init.d/minecraft: 9: /etc/ini
          avril 03 17:07:23 raspberrypi minecraft[11708]: /etc/init.d/minecraft: 10: /etc/in
          avril 03 17:07:23 raspberrypi minecraft[11708]: /etc/init.d/minecraft: 11: /etc/in
          avril 03 17:07:23 raspberrypi systemd[1]: minecraft.service: control process exite
          avril 03 17:07:23 raspberrypi systemd[1]: Failed to start LSB: minecraft server De
          -- Subject: L'unité (unit) minecraft.service a échoué
          -- Defined-By: systemd
          -- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
          --
          -- L'unité (unit) minecraft.service a échoué, avec le résultat failed.
          avril 03 17:07:23 raspberrypi systemd[1]: Unit minecraft.service entered failed st
          avril 03 17:07:23 raspberrypi sudo[11687]: pam_unix(sudo:session): session closed
          avril 03 17:07:26 raspberrypi sudo[11719]: minecraft : TTY=pts/0 ; PWD=/home/minec
          avril 03 17:07:26 raspberrypi sudo[11719]: pam_unix(sudo:session): session opened



          et voici le dernier script :
          #!/bin/sh
          ### BEGIN INIT INFO
          # Provides: minecraft Required-Start: $remote_fs
          # Required-Stop: Default-Start: 2 3 4 5 Default-Stop:
          # Short-Description: minecraft server Description: minecraft
          # server
          ### END INIT INFO
          . /lib/lsb/init-functions [ -f /etc/default/rcS ] && .
          /etc/default/rcS PATH=/bin:/usr/bin:/sbin:/usr/sbin case
          "$1" in
            start)
                  log_begin_msg "Starting minecraft server"
                  screen java -Xms512M -Xmx1024M -XX:MaxPermSize=128M -jar /home/minecraft/$
                  log_end_msg 0
                  ;;
            stop)
                  kill -9 $(ps -eo pid,cmd | grep java | grep
          spigot.jar | cut -d" " -f2)
                  ;;
            force-reload|restart)
                  $0 start
                  ;;
            status)
                  exit 0
                  ;;
            *)
                  log_success_msg "Usage: /etc/init.d/minecraft
          {start|stop|restart|force-reload|status}"
                  exit 1 esac
          exit 0
          
          

          merci pour votre persévérance,
          vivelesgrecs
          0
          1. Modérateur
            screen java -Xms512M -Xmx1024M -XX:MaxPermSize=128M -jar /home/minecraft/$


            Le $ me paraît suspect. Si tu as moyen de lancer directement ton ".jar" en tant que daemon, c'est mieux que screen. Si aucune de ces deux solutions ne marche tu peux essayer avec
            nohup
            :

            nohup java -jar myapp.jar &


            Quelle que soit la solution adopitée, il faut la tester au préalable dans une ligne de commande. Elle doit :
            1) se lancer correctement,
            2) rendre la main.

            Bonne chance
            0
          2. bonjour,
            nohup rend pareil.
            pour le $, c'est une erreur de copié collé, en réalité c'est /home/minecraft/mc-server/spigot.jar
            merci,
            vivelesgrecs
            0
          3. Modérateur
            Mais du coup si ces commandes marchent (avec nohup ou screen), du coup ton serveur est lancé ?
            0
          4. screen marche dans mon alias du coup le serveur est lancé mais pas grâce au démon minecraft, je l'ai lancé manuellement.
            0
          5. Modérateur
            A priori rien n'empêche de lancer un service via
            nohup 
            depuis un script de démarrage, c'est d'ailleurs une solution que tu trouves couramment sur Internet. Et a priori je ne vois aucune raison pour laquelle
            screen
            ne serait pas dans ce cas.

            Si la commande que tu mets dans ce script marche en root, ton service devrait marcher. Peut-être que tu avais déjà une instance de ton serveur qui était lancée ?

            Tu pourrais tester ton script pas à pas en copiant collant les lignes avant $1 puis les lignes qui sont dans le bloc "start".

            Mais déjà dans ce que tu as copié collé je dirais qu'il manque au moins un retour à la ligne avant "case". Une erreur de syntaxe suffit à expliquer pourquoi ton script ne marche actuellement pas.
            0