我如何才能完整记录所有 bash 脚本操作?

我如何才能完整记录所有 bash 脚本操作?

从我的脚本输出中,我想要捕获所有带有错误消息的日志数据并将它们全部重定向到日志文件。

我有如下脚本:

#!/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命令是否成功?

我需要收集所有日志。我需要它来监控脚本中每个命令的结果,以便更好地分析脚本失败时发生的情况。

答案1

我通常在每个脚本的开头放置类似以下内容(特别是如果它作为守护进程运行时):

#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':

解释:

  1. exec 3>&1 4>&2

    保存文件描述符,以便它们可以恢复到重定向之前的状态,或者用于输出到以下重定向之前的状态。

  2. trap 'exec 2>&4 1>&3' 0 1 2 3

    恢复特定信号的文件描述符。一般不需要,因为它们应该在子 shell 退出时恢复。

  3. exec 1>log.out 2>&1

    重定向stdout到文件log.out然后重定向stderrstdout。请注意,当您希望它们转到同一个文件时,顺序很重要。stdout 必须在 重定向至 之前被stderr重定向stdout

从那时起,要查看控制台上的输出(可能),您可以简单地重定向到&3。例如,

echo "$(date) : part 1 - start" >&3

在执行上面第 3 行之前,将会转到stdout指定的位置,大概是控制台。

答案2

当我阅读您的问题时,您不想记录输出,而是记录整个命令序列,在这种情况下,其他答案将不会对您有帮助。

使用 -x 调用 shell 脚本来输出所有内容:

sh -x foo.sh

使用以下命令登录到您想要的文件:

sh -x foo.sh >> /home/scripts/cron/logs

答案3

要将 ssh 输出到您的日志文件,您必须重定向stderrstdout。您可以通过2>&1在 bash 脚本后附加来执行此操作。

它应该看起来像这样:

#!/bin/bash
(
...
) 2>&1 | tee ...

当这不能按正确的顺序显示消息时,请尝试添加另一个子 shell:

#!/bin/bash
((
...
) 2>&1) | tee ...

答案4

根据其他人的说法,手动的是一个很好的资源。我把:

#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x

在脚本的顶部,我希望继续运行,或者set -ex它是否应该在出现错误时退出。

相关内容