Linux
如何完全記錄所有 bash 腳本操作?
從我的腳本輸出中,我想擷取所有帶有錯誤消息的日誌數據並將它們全部重定向到日誌文件。
我有如下腳本:
#!/bin/bash ( echo " `date` : part 1 - start " ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit' echo " `date` : sleep 120" sleep 120 echo " `date` : part 2 - start" ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit' echo " `date` : part 3 - start" ssh admin@server.com '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
保存文件描述符,以便它們可以恢復到重定向之前的任何內容,或者使用它們自己輸出到以下重定向之前的任何內容。 2.
trap 'exec 2>&4 1>&3' 0 1 2 3
恢復特定信號的文件描述符。通常不需要,因為它們應該在子 shell 退出時恢復。 3.
exec 1>log.out 2>&1
重定向
stdout
到文件,log.out
然後重定向stderr
到stdout
. 請注意,當您希望它們轉到同一個文件時,順序很重要。stdout
必須在被重定向到之前stderr
被重定向stdout
。從那時起,要在控制台上查看輸出(也許),您可以簡單地重定向到
&3
. 例如,echo "$(date) : part 1 - start" >&3
在執行上面的第 3 行之前,將轉到指定的任何地方
stdout
,大概是控制台。