我想从脚本输出中捕获所有的日志数据,包括错误消息,并将它们全部redirect到日志文件。
我有像下面的脚本:
#!/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命令成功?
我需要收集所有的日志数据。 我需要这个监视脚本中每个命令的结果,以便更好地分析脚本失败时发生了什么。
我通常在每个脚本的开始部分放置类似于以下内容的东西(尤其是如果它将作为守护进程运行的话):
#!/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':
说明:
exec 3>&1 4>&2
保存文件描述符,以便它们可以恢复到redirect之前的状态,或者用它们自己输出到之前的redirect之前。
trap 'exec 2>&4 1>&3' 0 1 2 3
恢复特定信号的文件描述符。 通常不需要,因为当子壳退出时它们应该被恢复。
exec 1>log.out 2>&1
将stdout
redirect到文件log.out
然后将stderr
redirect到stdout
。 请注意,当你希望他们去相同的文件时,顺序是重要的。 stderr
被redirect到stdout
之前, stdout
必须被redirect。
从此,在控制台上看到输出(也许),你可以简单地redirect到&3
。 例如,
echo "$(date) : part 1 - start" >&3
将执行stdout
地方,大概是控制台,在执行上面的第3行之前。
要获得ssh输出到你的日志文件,你必须将stderr
redirect到stdout
。 你可以通过在你的bash脚本之后附加2>&1
。
它应该是这样的:
#!/bin/bash ( ... ) 2>&1 | tee ...
当这不以正确的顺序显示消息时,尝试添加另一个子shell:
#!/bin/bash (( ... ) 2>&1) | tee ...
当我读到你的问题时,你不想logging输出,而是logging整个命令序列,在这种情况下,其他答案不会帮助你。
用-x调用shell脚本输出所有内容:
sh -x foo.sh
通过以下方式login到您想要的文件:
sh -x foo.sh >> /home/scripts/cron/logs
在bash中,你可以放置set -x
,它会打印出它执行的每个命令(和bashvariables)。 您可以用set +x
closures它。
如果你想成为偏执的人,你可以在你的脚本中set -o errexit
。 这意味着如果一个命令返回一个非零的退出代码,这个脚本将会失败并停止,这是unix标准的方式来表示出了错误。
如果你想得到更好的日志,你应该看看在moreutils
debian / Ubuntu的包的ts
。 它会在每行的前面添加一个时间戳并将其打印出来。 所以你可以看到事情发生的时间。