這就是我在腳本(通常是 cronjobs)中記錄 stdout 和 stderr 的方式:
#!/bin/bash
mylog() {
echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1"
}
(
mylog 'start'
some-command || mylog 'error' && exit 1
mylog 'end'
) >> /var/log/my-log.log 2>&1
在某些腳本中,我使用 return 而不是 exit 並且工作正常,但現在它說我不能使用 return,除非我將腳本包含在 src 中或在函數中使用它。所以我將其更改為退出,但問題是它沒有記錄任何內容,看起來它停止了 >> 輸出重定向。另一個問題是我以後將無法將其包含在 src 中,因為我只想停止這個腳本,而不是所有內容。
我使用輸出重定向是因為我想記錄所有內容,即使沒有發生錯誤。有時命令甚至不會返回正確的退出代碼,所以我不能相信這一點。
那我怎麼才能「返回」錯誤呢?我知道“set -e”,但我更喜歡對何時停止腳本有更多的控制。
有什麼想法嗎?
答案1
我無法解釋您所遇到的行為,但這裡有一個可能的解決方案:
#!/bin/bash 我的日誌(){ echo "[$(日期 '+%Y-%m-%d %H:%M:%S')] $1" } mymain() { ( mylog '開始' 某些命令 || mylog '錯誤' && 回傳 1 我的日誌“結束” ) >> /var/log/my-log.log 2>&1 } 我的主線
或者,從函數定義中刪除重定向mymain
並將其放在mymain
函數呼叫中:
mymain >> /var/log/my-log.log 2>&1
(那麼您也應該能夠從mymain
函數定義中刪除括號。)或者,由於您希望將 IO 重定向到全部的腳本中,您可以將重定向與操作語句分開:
執行 >> /var/log/my-log.log 執行2>&1 我的主線
由於我不明白為什麼你的方法失敗了,所以我無法解釋為什麼上述任何方法更有可能按預期工作。然而,它們做同一件事的方式略有不同,這可能就足夠了。順便說一下,我改成`date …`
只是$(date …)
出於一般原因;我不認為這與你的問題有任何關係。
答案2
screen
在linux下使用指令怎麼樣?除非您決心自己編寫解決方案,否則這將是由於技巧造成的。