linux lancer - Comment exécuter un script shell au démarrage




ubuntu service (13)

Sur une instance linux d'amazon, j'ai deux scripts appelés start_my_app et stop_my_app qui démarrent et s'arrêtent pour toujours (qui lancent à mon tour mon application node.js). J'utilise ces scripts pour démarrer et arrêter manuellement mon application de noeud. Jusqu'ici tout va bien.

Mon problème: Je veux aussi le configurer de telle sorte que start_my_app soit exécuté à chaque démarrage du système. Je sais que j'ai besoin d'ajouter un fichier dans init.d et je sais comment symlink le dans le répertoire approprié dans rc.d , mais je ne peux pas comprendre ce qui doit réellement aller dans le fichier que je place dans init.d . Je pense que cela devrait être juste une ligne, comme, start_my_app , mais cela n'a pas fonctionné pour moi.


Answers

La méthode la plus facile si tout ce que vous voulez exécuter est un script simple, (ou n'importe quoi) est si vous avez un GUI pour utiliser le système> préférences puis les applications de démarrage.

il suffit de parcourir le script que vous voulez et voilà. (Rendre le script exécutable)


Définir une crontab pour cela

#crontab -e
@reboot  /home/user/test.sh

après chaque démarrage, il exécutera le script de test.


Juste avoir une ligne ajoutée à votre crontab ..

Assurez-vous que le fichier est exécutable:

chmod +x /path_to_you_file/your_file

Pour éditer le fichier crontab:

crontab -e

Ligne que vous devez ajouter:

@reboot  /path_to_you_file/your_file

C'est simple!


Créez votre propre exécutable / init

Ce n'est pas ce que tu veux, mais c'est amusant!

Choisissez simplement un fichier exécutable arbitraire, même un script shell , et démarrez le noyau avec le paramètre de ligne de commande:

init=/path/to/myinit

Vers la fin du démarrage, le noyau Linux exécute le premier exécutable de l'espace utilisateur sur le chemin donné.

Plusieurs projets fournissent des exécutables d' init populaires utilisés par les distributions majeures, par exemple systemd, et dans la plupart des distributions, init va fourrer un tas de processus utilisés dans le fonctionnement normal du système.

Mais nous pouvons détourner /init le pour lancer nos propres scripts minimaux afin de mieux comprendre notre système.

Voici une configuration minimale reproductible: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


Une approche simple consiste à ajouter une ligne dans /etc/rc.local :

/PATH/TO/MY_APP &

ou si vous voulez exécuter la commande en tant que root:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(l'arrière-plan esperant le processus et permet à rc.local de continuer à s'exécuter)

Si vous voulez un script d'initialisation complet, la distribution debian a un fichier template, donc:

cp /etc/init.d/skeleton /etc/init.d/your_app

et l'adapter un peu.


This solution simple a fonctionné pour moi sur une instance Amazon Linux exécutant CentOS. Modifiez votre fichier /etc/rc.d/rc.local et placez la commande ici. Il est mentionné dans ce fichier qu'il sera exécuté après tous les autres scripts d'initialisation. Alors faites attention à ce sujet. C'est ainsi que le fichier me cherche actuellement. . La dernière ligne est le nom de mon script.


Dans le fichier que vous mettez dans /etc/init.d/ vous devez le définir avec:

chmod +x /etc/init.d/start_my_app

Grâce à @meetamit, si cela ne fonctionne pas, vous devez créer un lien symbolique vers /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Veuillez noter que sur Debian, cela ne fonctionnera pas car votre script doit être compatible avec LSB (fournissez, au moins, les actions suivantes: start, stop, restart, force-reload et status): https://wiki.debian.org/LSBInitScripts

En guise de note, vous devriez mettre le chemin absolu de votre script au lieu d'un relatif, il peut résoudre des problèmes inattendus:

/var/myscripts/start_my_app

Et n'oubliez pas d'ajouter au-dessus de ce fichier:

#!/bin/sh

pour certaines personnes cela fonctionnera Vous pouvez simplement ajouter la commande suivante dans Système> Préférences> Applications de démarrage:

bash /full/path/to/your/script.sh

C'est comme ça que je le fais sur les systèmes à chapeau rouge

Mettez votre script dans /etc/init.d , appartenant à root et exécutable. En haut du script, vous pouvez donner une directive pour chkconfig . Exemple, le script suivant est utilisé pour démarrer une application Java en tant qu'utilisateur oracle.

Le nom du script est /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

ceci indique que le script doit fonctionner aux niveaux 3, 4 et 5 et la priorité pour le démarrage / arrêt est 99 et 10.

puis, en tant qu'utilisateur root, vous pouvez utiliser chkconfig pour activer ou désactiver le script au démarrage,

chkconfig --list apex
chkconfig --add apex

et vous pouvez utiliser le service start / stop apex


si vous voulez mettre le démarrage aussi, vous pouvez utiliser

tout d'abord déplacez votre script /etc/init.d puis chmod 777 /etc/init.d/votre nom de script

après appliquer la commande suivante

update-rc.d votre script par défaut remove update-rc.d -f votre script remove

Au démarrage, vous pouvez voir que votre application va fonctionner.


Une autre option est d'avoir une commande @reboot dans votre crontab.

Toutes les versions de cron ne le permettent pas, mais si votre instance est basée sur l'AMI Amazon Linux, cela fonctionnera.


Tu peux le faire :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

alors utilisez cette commande

update-rc.d start_my_app defaults 100

S'il vous plaît voir cette page sur Cyberciti .


// boucle jusqu'à ce que le nombre d'occurrences atteigne 0. OU simplement copier / coller

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }






linux node.js init.d forever