Comment puis-je créer un script dans /etc/init.d au démarrage?

83

Je pense avoir lu quelque chose il y a quelque temps à ce sujet, mais je ne me souviens pas comment cela s'est passé. Pour l’essentiel, j’ai un service dans /etc/init.dlequel je voudrais démarrer automatiquement au démarrage. Je me souviens que cela a quelque chose à voir avec la création de liens symboliques dans le /etc/rc.drépertoire, mais je ne m'en souviens pas pour le moment. Quelle est la commande pour cela?

Je crois que je suis sur un dérivé de Fedora / CentOS.

Naftuli Kay
la source
Cela dépend de votre système d'exploitation. Quelle variante unix utilisez-vous, et si Linux, quelle distribution? Ce qui entre /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localet un peu plus t - il?
Gilles
1
Je pense que je suis sur CentOS ou quelque chose comme ça. La réponse serait-elle différente pour Debian? Je suis également intéressé par une solution pour Debian.
Naftuli Kay le

Réponses:

109

Comme vous l'avez mentionné, si vous utilisez un système Red Hat, vous pouvez effectuer les opérations suivantes:

  1. Créez un script et placez-le dans /etc/init.d(par exemple /etc/init.d/myscript). Le script doit avoir le format suivant:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Le format est assez standard et vous pouvez voir les scripts existants dans /etc/init.d. Vous pouvez ensuite utiliser le script comme suit /etc/init.d/myscript startou chkconfig myscript start. La ckconfigpage de manuel explique l’en-tête du script:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

Les exemples de code de démarrage, d'arrêt et d'état utilisent les fonctions d'assistance définies dans /etc/init.d/functions

  1. Activer le script

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Vérifiez que le script est bien activé - vous devriez voir "activé" pour les niveaux que vous avez sélectionnés.

    $ chkconfig --list | grep myscript
    
canen
la source
3
Chkconfig est ce que tu veux. +1
whoami
Pourquoi init a-t-il démarré quelque chose aux niveaux d'exécution 2, 3, 4 et 5? Ne prenez-vous pas soin d'éviter de démarrer un serveur au niveau d'exécution 2? Et le niveau d'exécution 4 n'est de toute façon pas défini sur RHEL, alors pourquoi essayer de le démarrer à ce niveau d'exécution? Pas de critique, je veux juste savoir. Je suis un utilisateur natif de Slackware.
Bruce Ediger
4 n'est pas défini sur RHEL, mais il existe. Vous pouvez le voler pour vos propres affaires.
Kevin M
L'en-tête provient de la page de manuel chkconfig. Personnellement, je m'en tiens à 235 ou à 35 dans la plupart des cas.
Canen
Existe-t-il un journal que je peux consulter si quelque chose ne démarre pas au démarrage?
Utkarsh Sinha
10

Vous testez le niveau d'exécution de votre machine.

runlevel

C'est souvent 5 ou 2 - il y a différentes conventions, mais rien n'est vraiment établi, autant que je sache. Ubuntu utilise 2, alors que l'ancienne distribution que j'ai utilisée a toujours utilisé

  • 1 utilisateur unique (super utilisateur)
  • 2 utilisateurs multiples
  • 3 multi utilisateurs + réseau
  • 4 non utilisé / définissable par l'utilisateur
  • 5 utilisateurs multiples, réseau + X11

Ensuite, vous faites un lien symbolique à partir de votre init-script, peut-être /etc/init.d/foobarpour/etc/rc2.d/SXYfoobar

S signifie 'Démarrer ce script dans ce niveau d'exécution (ici: 2). XY est un nombre décimal à deux chiffres, pertinent pour la séquence; les scripts sont démarrés.

Si vous dépendez du script S45barfoo pour s'exécuter avant vous et que S55foofoo dépend de votre script, vous choisirez xy entre 45 et 55. À nombre égal, l'ordre de démarrage n'est pas défini.

Pendant ce temps, Ubuntu est passé (est en train de passer) à une autre procédure de démarrage, appelée upstart.

Et remarque: pas toujours les liens pointant vers /etc/rcX.d- parfois, /etc/init/rcX.dou quelque chose de similaire, mais il devrait être facile à trouver, quelque part en dessous de / etc.

Si vous souhaitez démarrer quelque chose à la fin des scripts de démarrage, recherchez /etc/rc.localun fichier, mais si cela dépend de X11 déjà en cours d'exécution, vous pouvez rechercher une option de démarrage automatique de votre environnement de bureau ou /etc/X11/Xsession.d/un modèle similaire à celui décrit. au dessus de.

Si vous dépendez de la disponibilité du réseau, il existe un répertoire séparé (if-up.d) et pour les périphériques montés, tels que les lecteurs USB externes /etc/udev/rules.d/.

Utilisateur inconnu
la source
N'y a-t-il pas une commande qui fait le lien symbolique pour vous? Je pensais que je me souvenais de quelque chose comme ça.
Naftuli Kay le
1
N'était-ce pas update-rc.d?
Naftuli Kay le
GUI ou ligne de commande? Votre DE peut fournir un outil pour marquer les niveaux d’exécution, ainsi que pour démarrer ou arrêter votre script. J'ai vu quelque chose comme ça, mais je ne me souviens pas d'un nom et comment spécifier le nombre (xy).
utilisateur inconnu le
Ligne de commande. Il gère les liens symboliques pour vous et vous permet de basculer les commutateurs sur le fonctionnement ou non de certains scripts.
Naftuli Kay
3

Comme Naftuli Tzvi Kay l'a interrogé à propos de Debian ci-dessus: À compter de Debian 6, votre script devrait contenir un en-tête LSB (Linux Standards Base) qui indique ses dépendances et ses fonctionnalités ( voir la page du wiki debian ).

Si un en-tête LSB est présent, vous pouvez utiliser insservpour inclure votre script dans le processus de démarrage ( voir une autre page du wiki debian ).

mdt
la source