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

28

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.det /etc/rc.d/rc?.dlierai les niveaux d'exécution appropriés . Pour les petits scripts, je vais ajouter à /etc/rc.d/rc.local. Ce processus semble se dérouler sans heurts.

Maintenant, j'ai peaufiné 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/messageset fouillé le reste /var/logmais je 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 capturer la stdout / stderr de mes scripts init.d?

Merci d'avance.

McKAMEY
la source
Si vous optez pour une distribution plus moderne avec systemd, il s'en chargera pour vous et permettra de journaliser les messages du journal de chaque service.
eckes

Réponses:

17
  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 des fonctions init.d qui pourraient vous y aider - ajoutez votre distribution à votre question).

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

Nils
la source
9

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

#!/bin/bash

    /path/to/your/script &>/path/to/logfile
user9517 prend en charge GoFundMonica
la source
6

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
ott--
la source
Merci, c'est plus proche de ce que je cherchais. Je sais comment rediriger les E / S mais je ne savais pas comment appeler l'enregistreur.
McKAMEY
Un [ -r ... ]test pour vérifier s'il existe?
McKAMEY
Oui, vérifiez si le fichier est lisible.
ott--
5

Les messages des scripts d'initialisation ne sont généralement capturés nulle part. Ainsi, vous devez mettre en place un moyen de le faire vous-même. Une bonne idée est d'utiliser loggerpour 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/ .

qugu
la source