Comment exécuter un script shell au démarrage
sur une instance d'amazon linux, j'ai deux scripts appelés start_my_app
et stop_my_app
qui démarrent et arrêtent forever (qui à son tour exécute mon noeud.js app). J'utilise ces scripts pour démarrer et arrêter manuellement mon application de noeud. So far So good.
mon problème: je veux aussi le configurer de manière à ce que start_my_app
soit exécuté dès que le système démarre. Je sais que j'ai besoin d'ajouter un fichier dans init.d
et je sais comment lien symbolique vers le répertoire approprié dans rc.d
, mais ne peut pas comprendre ce qui a réellement besoin d'aller à l'intérieur le fichier que je place dans init.d
. Je pense que ça devrait être juste une ligne, comme start_my_app
, mais ça n'a pas marché pour moi.
15 réponses
Dans le fichier que vous mettez dans /etc/init.d/
vous devez définir 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: démarrer, arrêter, redémarrer, recharger de force, et statut): https://wiki.debian.org/LSBInitScripts
comme note, vous devez mettre le chemin absolu de votre script au lieu d'un chemin relatif, il peut résoudre des problèmes inattendus:
/var/myscripts/start_my_app
et n'oubliez pas d'ajouter en haut de ce fichier:
#!/bin/sh
mettre un crontab pour ce
#crontab -e
@reboot /home/user/test.sh
après chaque démarrage, il lancera le script de test.
une approche simple consiste à ajouter une ligne dans /etc/rc.local
:
/PATH/TO/MY_APP &
ou si vous voulez exécuter la commande comme root:
su - USER_FOOBAR -c /PATH/TO/MY_APP &
(la fuite esperluette origines du processus et permet à la rc.local à poursuivre l'exécution)
si vous voulez un script d'initialisation complet, debian distro a un fichier de modèle, alors:
cp /etc/init.d/skeleton /etc/init.d/your_app
et l'adapter un peu.
C'est la façon dont je le fais sur le red-hat systèmes
mettez votre script dans /etc/init.d
, propriété de root et exécutable. En haut du script, vous pouvez donner une directive pour chkconfig
. Exemple, le script suivant est utilisé pour lancer 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 "" 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 dit que le script doit tourner aux niveaux 3, 4 et 5 et la priorité pour démarrer / arrêter est de 99 et 10.
alors, en tant que root utilisateur, 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 de démarrage/arrêt de l'apex
une autre option est d'avoir une commande @reboot dans votre crontab.
toutes les versions de cron ne supportent pas cela, mais si votre instance est basée sur L'AMI Linux D'Amazon alors cela fonctionnera.
il suffit d'ajouter une ligne à votre crontab..
assurez-vous que le fichier est exécutable:
chmod +x /path_to_you_file/your_file
Pour éditer la crontab:
crontab -e
ligne à ajouter:
@reboot /path_to_you_file/your_file
c'est simple!
entrer cron
en utilisant sudo
:
sudo crontab -e
ajouter une commande pour exécuter au démarrage, dans ce cas un script:
@reboot sh /home/user/test.sh
Enregistrer:
Appuyez sur la touche ECHAP puis :x pour enregistrer et quitter, ou appuyez sur ESC puis ZZ (maj+zz)
Test Test Test Test :
-
lancez votre script de test sans cron pour vous assurer qu'il fonctionne réellement.
-
assurez-vous d'avoir sauvegardé votre commande dans cron, utilisez
sudo crontab -e
-
redémarrer le serveur pour confirmer tout fonctionne
sudo @reboot
créez votre propre / init exécutable
Ce n'est pas ce que vous voulez, mais c'est amusant!
il suffit de choisir un fichier exécutable arbitraire, même un script shell , et démarrer le noyau avec le paramètre ligne de commande:
init=/path/to/myinit
vers la fin du démarrage, le noyau Linux exécute le premier userspace exécutable sur le chemin donné.
plusieurs projets fournir des exécutables populaires init
utilisés par les distros majeurs, par exemple systemd, et dans la plupart des distros init va bifurquer un tas de processus utilisés dans le fonctionnement normal du système.
mais nous pouvons détourner /init
il pour exécuter nos propres scripts minimaux pour mieux comprendre notre système.
Voici une configuration minimale reproductible: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init
Pour Debian 9 Voir https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up . Il est aidé moi. Version courte Pour Debian 9: ajouter des commandes (en tant que root) à /etc/rc.local
/path_to_file/filename.sh || exit 1 # Added by me
exit 0
probablement, /path_to_file/filename.sh devrait être exécutable (je pense que oui).
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 une interface graphique 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à. (faire un script exécutable)
cette solution simple a fonctionné pour moi sur une instance Linux Amazone tournant CentOS.
Modifiez votre fichier /etc/rc.d/rc.local
et mettez la commande là. Il est mentionné dans ce fichier qu'il sera exécuté après tous les autres scripts d'initialisation. Soyez donc prudent à cet égard. C'est comme ça que le fichier me recherche actuellement. . La dernière ligne est le nom de mon script.
- ajoutez votre script à /etc/init.d/ répertoire
- mettez à jour vos niveaux d'exécution rc:
$ update-rc.d myScript.sh defaults NN
où NN est l'ordre dans lequel il doit être exécuté. 99 par exemple, signifie qu'il serait courir après 98 et 100.
pour certaines personnes, cela fonctionne Vous pouvez simplement ajouter la commande suivante dans System > Preferences > Startup Applications:
bash /full/path/to/your/script.sh
si vous voulez mettre le démarrage aussi vous pouvez utiliser
tout d'abord, déplacez votre script /etc/init.d alors chmod 777 / etc / init.d / votre nom de script
après application Suivant commande
update-rc.d votre script par défaut supprimer update-rc.d-f votre script Supprimer
au démarrage, vous pouvez voir votre application s'exécute.