从我的脚本输出中,我想捕获所有带有错误消息的日志数据并将它们全部重定向到日志文件。
我有如下脚本:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f [email protected] 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh [email protected] 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh [email protected] 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
我想查看文件中的所有操作/home/scripts/cron/logs
但我只看到我在echo
命令之后放置的内容。
如何在日志中检查该SSH
命令是否成功?
我需要收集所有日志。我需要它来监视脚本中每个命令的结果,以便更好地分析脚本失败时发生的情况。
我通常在每个脚本的开头放置类似于以下内容的内容(特别是如果它将作为守护程序运行):
解释:
exec 3>&1 4>&2
保存文件描述符,以便它们可以恢复到重定向之前的任何内容,或者使用它们自己输出到以下重定向之前的任何内容。
trap 'exec 2>&4 1>&3' 0 1 2 3
恢复特定信号的文件描述符。通常不需要,因为它们应该在子 shell 退出时恢复。
exec 1>log.out 2>&1
重定向
stdout
到文件,log.out
然后重定向stderr
到stdout
. 请注意,当您希望它们转到同一个文件时,顺序很重要。stdout
必须在被重定向到之前stderr
被重定向stdout
。从那时起,要在控制台上查看输出(也许),您可以简单地重定向到
&3
. 例如,在执行上面的第 3 行之前,将转到指定的任何地方
stdout
,大概是控制台。当我阅读您的问题时,您不想记录输出,而是记录整个命令序列,在这种情况下,其他答案对您没有帮助。
使用 -x 调用 shell 脚本以输出所有内容:
sh -x foo.sh
登录到您想要的文件:
sh -x foo.sh >> /home/scripts/cron/logs
要将 ssh 输出到您的日志文件,您必须重定向
stderr
到stdout
.2>&1
您可以通过在 bash 脚本之后附加来做到这一点。它应该是这样的:
当这没有以正确的顺序显示消息时,尝试添加另一个子shell:
在 bash 中,您可以放置
set -x
,然后它会打印出它执行的每个命令(以及 bash 变量)。您可以使用 将其关闭set +x
。如果你想偏执,你可以
set -o errexit
输入你的脚本。这意味着如果一个命令返回非零退出代码,脚本将失败并停止,这是 Unix 标准方式来表示出现问题。如果你想获得更好的日志,你应该查看
ts
debianmoreutils
/ubuntu 包。它将在每一行前面加上一个时间戳并将其打印出来。所以你可以看到事情发生的时间。按照其他人的说法,套装手册是一个很好的资源。我放:
在脚本的顶部,我希望继续,或者
set -ex
如果它应该在错误时退出。我发现@nicerobot (如何完全记录所有 bash 脚本操作?)答案可能不足以将所有输出完全重定向到控制台。一些输出仍然可能丢失。
完整的重定向如下所示:
说明:
echo
调用重定向到控制台和文件,因此 pipe-plus-tee 是拆分输出流的唯一方法。(...)
运算符将每个流重定向到一个独立的文件,或者通过单独的步骤将所有流恢复为原始文件。第二个原因是因为myfoo
在自我重入之前的调用必须按原样工作而无需任何额外的重定向。NEST_LVL
变量来表示嵌套调用级别。IMPL_MODE
变量显式启用内部重定向。TL;DR - 昨天我写了一套记录程序运行和会话的工具。
目前可在https://github.com/wwalker/quick-log获得
作为管理员,我总是想记录一些命令的输出,通常不是脚本。为了解决这个问题,我写了一些东西。最简单的方法是使用 xX0v0Xx 提到的程序“脚本”。我发现调用脚本(不带任何参数)通常会导致我覆盖之前脚本的输出。所以我创建了这个别名。它所做的只是防止覆盖。你需要一个 ~/tmp 目录。
当我想赶上一个交互式会话时,这很棒。
当我想记录命令(脚本或二进制文件)的输出时,我要么想要准确的输出,要么想要每行前面带有时间戳的输出。所以我写了这两个bash函数:
像往常一样运行你的命令:
或者
这刚刚创建了 2 个文件,名为:
但是,等等还有更多!!
我不想通过 ls 来查找刚刚为我创建的 justlog 或 timelog 的日志文件的名称。所以,我又增加了 3 个功能:
因此,您使用 justlog(或 timelog)运行您的命令,然后您只需使用 lesslog 或 viewlog(我可能会为这些人创建一个 emacs 日志):
就是这样,不
ls ~/tmp
,没有标签完成游戏来查找文件名。只需运行 lesslog (或 viewlog,如果你喜欢使用 vim 来查看日志)。可是等等!还有更多!
“我一直在我的日志文件上使用 grep” - 答案是,你猜对了,
greplog
首先,从所有 800 个服务器的 /etc/cron.d/atop 文件中获取已损坏的文本:
然后使用 greplog 获取主机名(在文件中输出上方的行:-)):
您可以简单地使用“脚本”。
man script
详情。例子:
所以,这是我使用的一个选项,并认为它更友好一些。本质上,在脚本的顶部定义一个任务函数,并使用它们自己的函数定义所有部分,以传递给任务函数的调用。它还可以扩展为您的日志添加一些特定的 INFO、WARN、DEBUG 和 ERROR 标志。它们只是使用 echo 以一致的方式包装您的消息的函数,因为所有输出都将进入您的日志。
它看起来像这样:
限制和注意事项: