web-dev-qa-db-fra.com

Comment exécuter un script Shell au démarrage

Sur une instance Amazon linux, j'ai deux scripts appelés start_my_app et stop_my_app qui démarrent et arrêtent forever (qui à leur tour exécute mon application node.js). J'utilise ces scripts pour démarrer et arrêter manuellement mon application de nœud. Jusqu'ici tout va bien.

Mon problème: je souhaite également le configurer de sorte que start_my_app soit exécuté à chaque démarrage du système. Je sais que je dois ajouter un fichier dans init.d et je sais comment le lier symboliquement au répertoire approprié dans rc.d, mais je ne peux pas déterminer ce qui doit réellement être inséré dans 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 fonctionné pour moi.

311
meetamit

Dans le fichier que vous avez mis dans /etc/init.d/, vous devez le définir comme exécutable 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/

Notez que dans la dernière version de Debian, cela ne fonctionnera pas car votre script doit être conforme à LSB (indiquez au moins les actions suivantes: démarrer, arrêter, redémarrer, recharger de force et statut): https : //wiki.debian.org/LSBInitScripts

En guise de remarque, vous devez indiquer 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 d'ajouter en plus de ce fichier: 

#!/bin/sh
256
Jonathan Muller

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.

236
Hemant kumar

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'esperluette de queue trace le processus et permet au rc.local de continuer à s'exécuter)

Si vous voulez un script d'initialisation complet, la distribution Debian a un fichier modèle, ainsi:

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

et l'adapter un peu.

118
Gilles Quenot

C'est comme ça que je fais sur les systèmes Red Hat.

Placez votre script dans /etc/init.d, propriété de root et du fichier exécutable. En haut du script, vous pouvez donner une directive pour chkconfig. Par exemple, le script suivant permet de 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 indique que le script doit être exécuté aux niveaux 3, 4 et 5 et que la priorité pour démarrer/arrêter 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 le service start/stop apex

31
Saule

Juste 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 vous devez ajouter:

@reboot  /path_to_you_file/your_file

C'est simple!

10

Une autre option consiste à 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, elle fonctionnera.

9
chris

Entrez cron en utilisant Sudo:

Sudo crontab -e

Ajoutez une commande à exécuter au démarrage, dans ce cas un script:

@reboot sh /home/user/test.sh

Sauvegarder:

Appuyez sur ESC, puis sur: x pour enregistrer et quitter, ou appuyez sur ESC, puis sur ZZ (Maj + zz).

Test Test Test :

  1. Exécutez votre script de test sans cron pour vous assurer qu'il fonctionne réellement.

  2. Assurez-vous d'avoir enregistré votre commande dans cron, utilisez Sudo crontab -e

  3. Redémarrez le serveur pour vérifier que tout fonctionne correctement Sudo @reboot

9
user3140639

Tu peux le faire :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

puis utilisez cette commande 

update-rc.d start_my_app defaults 100

Veuillez consulter cette page sur Cyberciti .

4
IR PRO

Créez votre propre exécutable/init

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’amorcer 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 init populaires utilisés par les principales distributions, par exemple. systemd, et dans la plupart des distributions, init lancera une série de processus utilisés dans le fonctionnement normal du système.

Mais nous pouvons le détourner /init pour exécuter 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

Pour Debian 9, voir https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up . C'est m'a aidé. Version courte pour Debian 9: Ajoutez 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).

1
Mikhail Ionkin

La solution simple This fonctionnait pour moi sur une instance Amazon Linux exécutant CentOS. Modifiez votre fichier /etc/rc.d/rc.local et entrez la commande. Il est mentionné dans ce fichier qu'il sera exécuté après tous les autres scripts d'initialisation. Alors soyez prudent à cet égard. Voici comment le fichier me ressemble actuellement . enter image description here . La dernière ligne est le nom de mon script.

1
shshnk

À Lubuntu, j'ai dû faire face à la situation opposée. Skype démarre après le démarrage et j'ai trouvé dans ~/.config/autostart/ le fichier skypeforlinux.desktop. Le contenu du fichier est le suivant: 

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Supprimer ce fichier m'a aidé.

0
aerijman

La méthode la plus simple, la plus simple et la plus universelle, consiste simplement à l'exécuter avec ~.bash_profile ou ~.profile (si vous n'avez pas le fichier bash_profile) .

Ajoutez simplement la commande d'exécution au bas de ce fichier et il sera exécuté au démarrage du système.

J'ai celui-ci au bas d'un exemple; ~\Desktop\sound_fixer.sh

0
Juko

La méthode la plus simple si vous souhaitez exécuter un script est simple (ou quoi que ce soit d'autre) si vous avez une interface graphique qui vous permet d'utiliser le système> préférences, puis les applications de démarrage.

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

0
fieldsweeper
  • Ajoutez votre script au répertoire /etc/init.d/
  • Mettez à jour vos niveaux d'exécution rc: $ update-rc.d myScript.sh defaults NN où NN correspond à l'ordre dans lequel il doit être exécuté. 99 par exemple signifiera qu'il sera exécuté après 98 et avant 100.
0
Kibrom Gebre