Wie finde ich Fehlermeldungen in Linux-Skripten init.d / rc.d?

28

Unter Linux habe ich einige Skripte geschrieben, die beim Booten ausgeführt werden sollen, und mit den verschiedenen Installationsmethoden experimentiert. Für größere Skripte werde ich /etc/init.ddie entsprechenden /etc/rc.d/rc?.dRunlevel einfügen und verlinken . Für kleinere Skripte füge ich an /etc/rc.d/rc.local. Dieser Prozess scheint reibungslos zu verlaufen.

Jetzt habe ich eines meiner Skripte optimiert und es schlägt fehl. Ich habe verdammt viel Zeit damit, das Problem zu diagnostizieren, weil ich die Fehlerausgabe scheinbar nicht erfassen kann. Ich habe nachgesehen /var/log/messagesund mich umgesehen /var/log, kann aber nichts Nützliches finden.

Weiß jemand:

  1. Werden diese Fehlermeldungen automatisch irgendwo erfasst?
  2. Wenn nicht, wie kann ich stdout / stderr aus meinen init.d-Skripten erfassen?

Danke im Voraus.

McKamey
quelle
Wenn Sie mit systemd zu einer moderneren Distribution wechseln, wird dies für Sie erledigt und Sie können Protokollnachrichten für jeden Dienst protokollieren.
Eckes

Antworten:

17
  1. Nein - sie gehen zu STDOUT (wenn Sie verwenden echo) oder STDERR (wenn Sie verwenden echo >&2).

  2. Ihre Skripte müssen eigenständig in Protokolle und / oder Syslog schreiben (Ihre Distribution enthält möglicherweise einige init.d- Funktionen, die Ihnen dabei helfen können - fügen Sie Ihre Distribution Ihrer Frage hinzu).

Wenn Sie sich für Protokolle entscheiden, suchen Sie nach dem teeBefehl. Wenn Sie sich für Syslog entscheiden, schauen Sie sich logger. Sie können sie beliebig kombinieren.

Nils
quelle
9

Schreiben Sie ein Wrapper-Skript, das Ihr Skript aufruft und die Ausgabe in eine Datei umleitet

#!/bin/bash

    /path/to/your/script &>/path/to/logfile
user9517 unterstützt GoFundMonica
quelle
6

Sie können eine Funktion erstellen, mit der die Nachricht sowohl auf dem Bildschirm als auch in Syslog wiedergegeben wird:

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

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

Sie können das auch in eine separate Datei schreiben und in Ihre Skripte einbinden

#!/bin/bash
myScript=$(basename $0)
[ -r /myFunctions/myecho ] && . /myFunctions/myecho
ott--
quelle
Danke, das ist näher an dem, wonach ich gesucht habe. Ich weiß, wie ich E / A umleiten soll, aber ich wusste nicht, wie ich den Logger aufrufen soll.
McKAMEY
Ist [ -r ... ]ein Test, um zu überprüfen, ob es existiert?
McKAMEY
Ja, überprüfen Sie, ob die Datei lesbar ist.
ott--
5

Nachrichten von Init-Skripten werden im Allgemeinen nirgendwo erfasst. Daher müssen Sie eine Möglichkeit implementieren, dies selbst zu tun. Eine gute Idee ist logger, alle Ausgaben an Syslog zu senden. In diesem Beispiel werden stdout und stderr an syslog gesendet:

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

Ich fand es in diesem tollen Artikel: http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/ .

qugu
quelle