Frage Wie finde ich Fehlermeldungen von Linux init.d / rc.d Skripten?


Unter Linux habe ich einige Skripte geschrieben, die während des Bootens ausgeführt werden und mit den verschiedenen Installationsmöglichkeiten gespielt werden. Für größere Skripts werde ich reinlegen /etc/init.d und verlinke das Passende /etc/rc.d/rc?.d Runlevel. Für kleinere Skripte werde ich anhängen /etc/rc.d/rc.local. Dieser Prozess scheint reibungslos zu laufen.

Jetzt habe ich eines meiner Skripte optimiert und es scheitert. Ich habe eine Menge Zeit damit, es zu diagnostizieren, weil ich die Fehlerausgabe nicht erfassen kann. Ich habe es überprüft /var/log/messages und stocherte um den Rest von /var/log kann aber nichts Nützliches finden.

Weiß jemand:

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

Danke im Voraus.


25
2017-12-17 16:51


Ursprung


serverfault.com/a/321926/59925 - quanta
@quanta das hat ein paar hilfreiche Tipps, danke. - McKAMEY
Wenn Sie zu einer moderneren Distribution mit systemd gehen, wird es das für Sie handhaben und erlauben, Protokollnachrichten jedes Services zu journieren. - eckes


Antworten:


  1. Nein - sie gehen zu STDOUT (wenn du benutzt echo) oder STDERR (wenn du benutzt echo >&2).

  2. Ihre Skripte müssen selbst in Protokolle und / oder Syslog schreiben (Ihre Distribution kann einige enthalten) init.d Funktionen, die dort helfen könnten - fügen Sie Ihre Distribution zu Ihrer Frage hinzu.

Wenn Sie nach Protokollen suchen, suchen Sie nach dem tee Befehl. Wenn Sie für syslog gehen, schauen Sie sich an logger. Sie können sie beliebig kombinieren.


16
2017-12-17 20:22





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

9
2017-12-17 17:54





Sie könnten eine Funktion erstellen, um die Nachricht sowohl auf dem Bildschirm als auch auf syslog zu wiederholen, etwa so:

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

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

Sie könnten dies auch in eine separate Datei einfügen und sie in Ihre Skripte mit aufnehmen

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

6
2018-05-18 09:41



Danke, das ist näher an dem, was ich gesucht habe. Ich weiß, wie ich I / O umleiten kann, aber ich wusste nicht, wie ich den Logger aufrufen sollte. - McKAMEY
Ist [ -r ... ] ein Test, um zu überprüfen, ob es existiert? - McKAMEY
Ja, überprüfen Sie, ob die Datei lesbar ist. - ott--


Nachrichten von Init-Skripten werden im Allgemeinen nicht erfasst. Daher müssen Sie eine Möglichkeit implementieren, dies selbst zu tun. Eine gute Idee ist es zu verwenden logger um 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 habe es in diesem tollen Artikel gefunden: http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/.


4