web-dev-qa-db-fra.com

Comment trouver des messages d'erreur à partir de scripts Linux init.d / rc.d?

Sous Linux, j'ai écrit quelques scripts à exécuter lors du démarrage et joué avec les différentes façons de les installer. Pour les scripts plus volumineux, je mettrai /etc/init.d et associez le /etc/rc.d/rc?.d niveaux d'exécution. Pour les petits scripts, je vais ajouter à /etc/rc.d/rc.local. Ce processus semble se dérouler sans heurts.

Maintenant, j'ai peaufiné l'un de mes scripts et il échoue. J'ai beaucoup de mal à le diagnostiquer car je n'arrive pas à capturer la sortie d'erreur. J'ai vérifié /var/log/messages et fouilla le reste de /var/log mais ne trouve rien d'utile.

Est-ce que quelqu'un sait:

  1. ces messages d'erreur sont-ils automatiquement capturés quelque part?
  2. sinon, comment puis-je capturer la stdout/stderr de mes scripts init.d?

Merci d'avance.

30
McKAMEY
  1. Non - ils vont à STDOUT (si vous utilisez echo) ou STDERR (si vous utilisez echo >&2).

  2. Vos scripts doivent écrire dans les journaux et/ou syslog par eux-mêmes (votre distribution peut contenir certaines fonctions init.d qui pourraient vous y aider - ajoutez votre distribution à votre question).

Si vous optez pour les journaux, recherchez la commande tee. Si vous optez pour syslog, regardez logger. Vous pouvez les combiner comme vous le souhaitez.

17
Nils

Écrivez un script wrapper qui appelle votre script et redirige la sortie vers un fichier

#!/bin/bash

    /path/to/your/script &>/path/to/logfile
9
user9517

Vous pouvez créer une fonction pour faire écho du message à l'écran et au syslog, quelque chose comme ceci:

LOGGER="/usr/bin/logger -t $myScript"    # check the location of logger for your system

myEcho () {
    echo "$1"
    $LOGGER "$1"
}

Vous pouvez également mettre cela dans un fichier séparé et l'inclure dans vos scripts avec

#!/bin/bash
myScript=$(basename $0)
[ -r /myFunctions/myecho ] && . /myFunctions/myecho
6
ott--

Les messages des scripts d'initialisation ne sont généralement capturés nulle part. Ainsi, vous devez mettre en œuvre un moyen de le faire vous-même. Une bonne idée est d'utiliser logger pour envoyer toutes les sorties vers syslog. Cet exemple enverra stdout et stderr à syslog:

exec 1> >(logger -s -t $(basename $0)) 2>&1

Je l'ai trouvé dans cet excellent article: http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/ .

5
qugu