Bagaimana menemukan pesan kesalahan dari skrip init.d / rc.d Linux?

28

Di Linux, saya telah menulis beberapa skrip untuk dieksekusi saat boot dan bermain-main dengan berbagai cara menginstalnya. Untuk skrip yang lebih besar saya akan memasukkan /etc/init.ddan menautkan /etc/rc.d/rc?.drunlevel yang sesuai . Untuk skrip yang lebih kecil, saya akan menambahkan /etc/rc.d/rc.local. Proses ini sepertinya berjalan dengan lancar.

Sekarang saya telah men-tweak salah satu skrip saya dan gagal. Saya bersenang-senang mendiagnosis karena sepertinya saya tidak dapat menangkap output kesalahan. Saya sudah memeriksa /var/log/messagesdan menyodok sisa /var/logtetapi tidak dapat menemukan sesuatu yang berguna.

Apakah ada yang tahu:

  1. apakah pesan kesalahan ini secara otomatis ditangkap di suatu tempat?
  2. jika tidak, bagaimana saya bisa menangkap stdout / stderr dari skrip init.d saya?

Terima kasih sebelumnya.

McKAMEY
sumber
Jika Anda pergi ke distribusi yang lebih modern dengan systemd itu akan menangani itu untuk Anda dan memungkinkan untuk mencatat jurnal pesan dari setiap layanan.
eckes

Jawaban:

17
  1. Tidak - mereka pergi ke STDOUT (jika Anda menggunakan echo) atau STDERR (jika Anda menggunakan echo >&2).

  2. Script Anda harus menulis ke log dan / atau syslog sendiri (distribusi Anda mungkin berisi beberapa fungsi init.d yang mungkin membantu di sana - tambahkan distribusi Anda ke pertanyaan Anda).

Jika Anda mencari log, cari teeperintah. Jika Anda pergi untuk melihat syslog logger. Anda dapat menggabungkannya dengan cara apa pun yang Anda inginkan.

Nils
sumber
9

Tulis skrip pembungkus yang memanggil skrip Anda dan arahkan output ke file

#!/bin/bash

    /path/to/your/script &>/path/to/logfile
user9517 mendukung GoFundMonica
sumber
6

Anda bisa membuat fungsi untuk menggema pesan ke layar dan ke syslog, seperti ini:

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

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

Anda juga bisa memasukkannya ke file terpisah dan memasukkannya ke dalam skrip Anda

#!/bin/bash
myScript=$(basename $0)
[ -r /myFunctions/myecho ] && . /myFunctions/myecho
ott--
sumber
Terima kasih, ini lebih dekat dengan apa yang saya cari. Saya tahu cara mengarahkan ulang I / O tapi saya tidak tahu cara memanggil ke logger.
McKAMEY
Apakah [ -r ... ]tes untuk memeriksa apakah ada?
McKAMEY
Ya, periksa apakah file dapat dibaca.
ott--
5

Pesan dari skrip init umumnya tidak ditangkap di mana pun. Dengan demikian, Anda perlu menerapkan cara untuk melakukannya sendiri. Ide yang bagus adalah menggunakan loggeruntuk mengirim semua output ke syslog. Contoh ini akan mengirim stdout dan stderr ke syslog:

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

Saya menemukannya di artikel hebat ini: http://urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/ .

qugu
sumber