Comment exécuter un script shell au démarrage?

13

J'ai créé un script pour démarrer un serveur (ma première question). Maintenant, je veux qu'il s'exécute au démarrage du système et démarre le serveur défini. Que dois-je faire pour que cela soit fait?

Mes découvertes me disent de mettre ce fichier dans la /etc/init.d emplacement, et il sera exécuté au démarrage du système. Mais je ne suis pas capable de comprendre comment le premier argument sur le démarrage sera start? Est-ce prédéfini quelque part à utiliser start comme $1? Si je veux avoir un cas startall Cela va démarrer tous les serveurs dans le script, alors quelles sont les options que je peux gérer?

Mon script est comme ça:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
vijay.shad
la source
Je sais que c'est vieux ... mais le shell devrait être "#! / Bin / sh" et non "#! / Bin / bash" / bin / sh est plus susceptible de fonctionner dans le cas d'une machine qui a des problèmes au démarrage (par exemple, / usr / lib ne pouvant pas être monté)
Rich Homolka

Réponses:

18

/etc/init.d est le répertoire de script dans lequel les scripts exécutables apparaissent. Toutefois, pour exécuter les scripts dans un ordre particulier après le démarrage de votre système, vous devez ajouter des fichiers au /etc/rc#.d annuaire. Les entrées qui apparaissent ici indiquent à votre système dans quel ordre et à quel niveau d'exécution les scripts de /etc/init.d devrait être exécuté. Le nombre après le rc indique le niveau d'exécution de la machine, selon ce tableau:

http://en.wikipedia.org/wiki/Runlevel

Donc si vous avez:

/etc/init.d/importantscript

Ensuite, vous avez besoin des fichiers (vides):

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

Le S signifie commencer et le K signifie tuer. Lorsque votre machine démarre, le système dit "Ah, je suis sur RunLevel 3, passons à rc3.d pour voir quels scripts de '/etc/init.d' doivent être exécutés et dans quel ordre." Dans ce cas, le système triera par «S», puis par le nombre après «S» et exécutera «/etc/init.d/importantscript start». Le 20 sert uniquement à des fins de commande ... votre script se déroulera derrière "S19" et devant "S21". Vous pouvez créer ces fichiers simplement en faisant:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Voici un bon résumé aussi: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

aronchick
la source
N'est-il pas plus courant de "ln -s /etc/init.d/script" à rcX.d / *?
ozma
8

Vous n'avez pas à - et ne devriez pas - créer de fichiers dans /etc/rc.d/rcN.d/; ce que vous devriez faire à la place est de mettre un commentaire dans la lecture de votre script init

# chkconfig NNN A B

NNN est l'ensemble des niveaux d'exécution dans lesquels vous voulez que le script soit actif (par exemple, 345 s'il est actif dans les niveaux d'exécution 3, 4, et 5 ), et A et B sont les priorités de départ et d’arrêt. ensuite chkconfig --add foo (en supposant que votre script est nommé foo ) créera les fichiers dans /etc/rc.d/rcN.d/ avec les noms appropriés.

Vous pouvez alors utiliser service foo bar envoyer le bar message à votre script (par exemple, start, stop, peu importe - c'est là ton $1 vient de).

Peter
la source
0

$ 1 est l'argument de ligne de commande transmis à votre script. Il s'agit de l'un des éléments suivants: démarrer, arrêter ou redémarrer. Dans openSUSE Je ne me souviens pas d’avoir eu la possibilité de passer d’autres arguments dans le script lors de l’utilisation de l’éditeur de niveaux d’exécution, donc je pense que ce sont probablement les seuls que vous devriez utiliser.

Je n'utilise pas CentOS moi-même, mais il semble que le programme pour contrôler ce qui est démarré à quel niveau d'exécution est Ntsysv .

Neal
la source