460 votes

Comment exécuter un script shell au démarrage

Sur un Amazon S3 Linux par exemple, j'ai deux scripts appelés start_my_app y stop_my_app qui démarrent et s'arrêtent pour toujours (qui à son tour exécute mon application Node.js). J'utilise ces scripts pour démarrer et arrêter manuellement mon application Node.js. Jusqu'à présent, tout va bien.

Mon problème : je veux aussi le configurer de telle sorte que start_my_app est exécuté à chaque fois que le système démarre. Je sais que je dois ajouter un fichier à l'intérieur de init.d et je sais comment faire un lien symbolique vers le bon répertoire dans le dossier rc.d mais je n'arrive pas à savoir ce que doit contenir le fichier que j'ai placé dans le répertoire de l'entreprise. init.d . Je pense que ça devrait être juste une ligne, comme, start_my_app mais cela n'a pas fonctionné pour moi.

5 votes

Je ne suis pas expert dans ce genre de choses, mais je pense que la init.d solution ( aquí ) doit être préféré à l'option rc.local car cette dernière est l'ancien outillage qui n'est encore utilisable que parce que le nouvel outillage est rétrocompatible.

0 votes

Pm2 start my_app ; pm2 startup ; pm2 save github.com/Unitech/pm2

0 votes

Dans Raspbian il y a un .config/lxsession/LXDE-pi/autostart qui a mieux fonctionné pour moi - y a-t-il un équivalent dans d'autres systèmes d'exploitation ? La raison pour laquelle cela a mieux fonctionné pour moi est que tout (dans mon cas apache) n'est pas initialisé lorsque rc.local est exécuté, alors que le démarrage automatique est le début de la session utilisateur, donc presque tout devrait être initialisé à ce moment-là.

341voto

Koren Points 993

Dans le fichier que vous avez mis /etc/init.d/ vous devez le rendre exécutable avec :

chmod +x /etc/init.d/start_my_app

Merci à @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 la dernière Debian, cela ne fonctionnera pas car votre script doit être conforme à la LSB (fournir, 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 chemin relatif, cela peut résoudre des problèmes inattendus :

/var/myscripts/start_my_app

Et n'oubliez pas de compléter ce dossier :

#!/bin/sh

10 votes

J'ai fait cela et il ne s'est pas exécuté. Est-ce qu'il s'exécutera automatiquement juste parce qu'il est dans /etc/init.d ou est-ce que je dois faire quelque chose en plus pour programmer son exécution au démarrage du système ?

6 votes

@amphibient Pas tout à fait assez... Vous devez aussi créer un lien symbolique vers ce fichier (en utilisant ln ) dans un répertoire situé dans rc.d

2 votes

Cela dépend de la distribution mais, rc-update add start_my_app devrait être suffisant pour le faire fonctionner au démarrage avec le paramètre "start" et à l'arrêt avec le paramètre "stop".

126voto

sputnick Points 31663

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 qu'utilisateur spécial :

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

(l'esperluette de fin met fin au processus et permet à rc.local de continuer à s'exécuter)

Si vous voulez un init complet script, la distro debian a un fichier modèle, donc :

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

et l'adapter un peu.

2 votes

Merci ! Cette approche s'est avérée la plus efficace compte tenu de la simplicité des exigences. Je suis presque sûr que j'avais besoin de spécifier l'utilisateur, sinon lorsqu'il fallait arrêter manuellement l'application (en exécutant stop_my_app ) Je devrais le faire avec sudo non ? Par ailleurs, je me demande quelle est la fonction exacte de l'esperluette de fin ( ?).

3 votes

L'utilisateur dépend de votre application. Mais s'il n'est pas absolument nécessaire de fonctionner en tant que Root, évitez-le. & exécuter le processus en arrière-plan

2 votes

Sputnick, désolé, mais je dois marquer la réponse de Koren comme étant la réponse acceptée, principalement à cause de ce que @erikb85 a souligné, mais aussi parce que ma question originale demandait le init.d de faire les choses (votre réponse n'était qu'une solution de rechange plus simple pour moi à l'époque). Cet article reçoit beaucoup de vues et de votes, il est donc important de rester précis.

38voto

Saule Points 61

C'est la façon dont je le fais sur Red Hat Linux systèmes.

Mettez votre script en /etc/init.d qui appartient à Root et qui est exécutable. Au sommet 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

Cela signifie que le script doit s'exécuter aux niveaux 3, 4 et 5, et que la priorité pour le démarrage et l'arrêt est 99 et 10.

Ensuite, 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 service start/stop apex .

0 votes

Entre-temps, j'ai expérimenté un paquet appelé supervisord ( supervisord.org ) qui est disponible dans le dépôt epel. Il peut être utilisé pour démarrer des programmes et les surveiller, en les redémarrant en cas d'échec.

0 votes

Au lieu de taper : "chkconfig --add service_name" après avoir mis script dans le dossier /etc/init.d/ vous pouvez taper : "chkconfig nom_service on"

14voto

chris Points 10694

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

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

-25voto

murat maman Points 21

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 script nom

après avoir appliqué la commande suivante

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X