Назад | Перейти на главную страницу

Как найти сообщения об ошибках в сценариях Linux init.d / rc.d?

В Linux я написал несколько сценариев для выполнения во время загрузки и поигрался с различными способами их установки. Для больших скриптов я добавлю /etc/init.d и свяжите соответствующий /etc/rc.d/rc?.d уровни выполнения. Для небольших скриптов я добавлю /etc/rc.d/rc.local. Кажется, этот процесс идет гладко.

Я настроил один из своих скриптов, но он не работает. У меня чертовски много времени на его диагностику, потому что я не могу зафиксировать вывод ошибки. Я проверил /var/log/messages и ковырялся в остальной части /var/log но не могу найти ничего полезного.

Кто-нибудь знает:

  1. эти сообщения об ошибках автоматически записываются где-нибудь?
  2. если нет, как я могу захватить stdout / stderr из моих сценариев init.d?

Заранее спасибо.

  1. Нет - они идут в STDOUT (если вы используете echo) или STDERR (если вы используете echo >&2).

  2. Ваши скрипты должны записывать в журналы и / или системные журналы самостоятельно (ваш дистрибутив может содержать некоторые init.d функции, которые могут там помочь - добавьте свой дистрибутив в свой вопрос).

Если вы идете за журналами, ищите tee команда. Если вы зайдете в системный журнал, посмотрите logger. Вы можете комбинировать их как хотите.

Напишите сценарий оболочки, который вызывает ваш сценарий и перенаправляет вывод в файлы.

#!/bin/bash

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

Сообщения из сценариев инициализации, как правило, нигде не записываются. Таким образом, вам нужно реализовать способ сделать это самостоятельно. Хорошая идея - использовать logger отправлять весь вывод в системный журнал. Этот пример отправит stdout и stderr в syslog:

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

Я нашел это в этой замечательной статье: http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/.

Вы можете создать функцию для вывода сообщения на экран и в системный журнал, примерно так:

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

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

Вы также можете поместить это в отдельный файл и включить в свои скрипты с помощью

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