Como encontrar mensagens de erro dos scripts init.d / rc.d do Linux?

28

No Linux, escrevi alguns scripts para serem executados durante a inicialização e brinquei com as várias maneiras de instalá-los. Para scripts maiores, colocarei /etc/init.de vincularemos os /etc/rc.d/rc?.dníveis de execução apropriados . Para scripts menores, anexarei a /etc/rc.d/rc.local. Esse processo parece estar ocorrendo sem problemas.

Agora ajustei um dos meus scripts e está falhando. Estou tendo um tempo enorme para diagnosticá-lo porque não consigo capturar a saída de erro. Eu verifiquei /var/log/messagese bisbilhotei o resto, /var/logmas não consigo encontrar nada de útil.

Alguém sabe:

  1. essas mensagens de erro são capturadas automaticamente em algum lugar?
  2. caso contrário, como posso capturar o stdout / stderr dos meus scripts init.d?

Desde já, obrigado.

McKAMEY
fonte
Se você for para uma distribuição mais moderna com o systemd, ele cuidará disso para você e permitirá registrar em diário as mensagens de cada serviço.
Eckes

Respostas:

17
  1. Não - eles vão para STDOUT (se você usar echo) ou STDERR (se você usar echo >&2).

  2. Seus scripts precisam gravar em logs e / ou syslog por conta própria (sua distribuição pode conter algumas funções init.d que podem ajudar lá - adicione sua distribuição à sua pergunta).

Se você procurar logs, procure o teecomando. Se você for para o syslog, olhe logger. Você pode combiná-los da maneira que quiser.

Nils
fonte
9

Escreva um script de wrapper que chame seu script e redirecione a saída para um arquivo

#!/bin/bash

    /path/to/your/script &>/path/to/logfile
user9517 suporta GoFundMonica
fonte
6

Você pode criar uma função para ecoar a mensagem na tela e no syslog, algo como isto:

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

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

Você também pode colocar isso em um arquivo separado e incluí-lo em seus scripts com

#!/bin/bash
myScript=$(basename $0)
[ -r /myFunctions/myecho ] && . /myFunctions/myecho
ott--
fonte
Obrigado, isso está mais próximo do que eu estava procurando. Eu sei como redirecionar a E / S, mas não sabia como chamar o criador de logs.
McKAMEY
É [ -r ... ]um teste para verificar se existe?
McKAMEY
Sim, verifique se o arquivo está legível.
#
5

Mensagens de scripts init geralmente não são capturadas em nenhum lugar. Portanto, você precisa implementar uma maneira de fazer isso sozinho. Uma boa idéia é usar loggerpara enviar toda a saída para o syslog. Este exemplo enviará stdout e stderr para o syslog:

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

Encontrei-o neste excelente artigo: http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/ .

qugu
fonte