如何从 Linux init.d/rc.d 脚本中查找错误消息?

McK*_*MEY 30 linux logging rc.d init.d

在 Linux 中,我编写了一些要在引导期间执行的脚本,并尝试了各种安装它们的方法。对于较大的脚本,我将放入/etc/init.d并链接适当的/etc/rc.d/rc?.d运行级别。对于较小的脚本,我将附加到/etc/rc.d/rc.local. 这个过程似乎很顺利。

现在我已经调整了我的一个脚本,但它失败了。我花了很长时间来诊断它,因为我似乎无法捕获错误输出。我已经检查/var/log/messages并浏览了其余部分,/var/log但找不到任何有用的东西。

有人知道吗:

  1. 这些错误消息是在某处自动捕获的吗?
  2. 如果没有,我如何从我的 init.d 脚本中捕获 stdout/stderr?

提前致谢。

Nil*_*ils 18

  1. 不 - 他们去STDOUT(如果你使用echo)或STDERR(如果你使用echo >&2)。

  2. 您的脚本必须自己写入日志和/或 syslog(您的发行版可能包含一些可能有帮助的init.d函数 - 将您的发行版添加到您的问题中)。

如果您查找日志,请查找tee命令。如果您查看 syslog,请查看logger. 你可以以任何你想要的方式组合它们。


use*_*517 9

编写一个包装脚本,调用您的脚本并将输出重定向到文件

#!/bin/bash

    /path/to/your/script &>/path/to/logfile
Run Code Online (Sandbox Code Playgroud)


ott*_*t-- 7

您可以创建一个函数将消息回显到屏幕和系统日志,如下所示:

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

myEcho () {
    echo "$1"
    $LOGGER "$1"
}
Run Code Online (Sandbox Code Playgroud)

您也可以将其放入一个单独的文件中,并将其包含在您的脚本中

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


小智 6

来自 init 脚本的消息通常不会在任何地方捕获。因此,您需要自己实现一种方法。一个好主意是使用logger将所有输出发送到系统日志。此示例将 stdout 和 stderr 发送到 syslog:

exec 1> >(logger -s -t $(basename $0)) 2>&1
Run Code Online (Sandbox Code Playgroud)

我在这篇很棒的文章中找到了它:http : //urbanautomaton.com/blog/2014/09/09/redirecting-bash-script-output-to-syslog/