在 Linux 中,我编写了一些在启动时执行的脚本,并尝试了各种安装方法。对于较大的脚本,我会将其放入/etc/init.d
并链接适当的/etc/rc.d/rc?.d
运行级别。对于较小的脚本,我会将其附加到/etc/rc.d/rc.local
。这个过程似乎运行得很顺利。
现在我调整了我的一个脚本,但它失败了。我花了很长时间来诊断它,因为我似乎无法捕获错误输出。我检查/var/log/messages
并研究了其余部分/var/log
,但找不到任何有用的东西。
有人知道吗:
- 这些错误信息会被自动捕获到某个地方吗?
- 如果没有,我该如何从我的 init.d 脚本中捕获 stdout/stderr?
提前致谢。
答案1
不 - 他们去标准输出(如果您使用
echo
)或标准错误(如果您使用echo >&2
)。你的脚本必须自己写入日志和/或系统日志(你的发行版可能包含一些初始化文件可能有帮助的功能-将您的分布添加到您的问题中)。
如果您要查看日志,请查找tee
命令。如果您要查看 syslog,请查找logger
。您可以以任何您想要的方式组合它们。
答案2
编写一个包装脚本,调用你的脚本并将输出重定向到文件
#!/bin/bash
/path/to/your/script &>/path/to/logfile
答案3
您可以创建一个函数将消息回显到屏幕和系统日志,如下所示:
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
答案4
来自 init 脚本的消息通常不会在任何地方被捕获。因此,您需要自己实现一种方法来执行此操作。一个好主意是使用logger
将所有输出发送到 syslog。此示例将 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/。