我使用rsync通過SSH編寫bash腳本來執行異地備份。我能夠通過發送STDERR到記錄器
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup | logger -i
發送到標準輸出記錄,原木,但我想給STDERR代替,因此,如果出現了問題,如異地是不可用的,該輸出應該發送到記錄器並記錄。
我使用rsync通過SSH編寫bash腳本來執行異地備份。我能夠通過發送STDERR到記錄器
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup | logger -i
發送到標準輸出記錄,原木,但我想給STDERR代替,因此,如果出現了問題,如異地是不可用的,該輸出應該發送到記錄器並記錄。
如果你想標準錯誤而不是標準輸出(而不是標準錯誤和標準輸出),你可以做以下內容:
,看起來像這樣:
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup 9> /dev/null 1>&9 2>&1 | logger -i
另外,還可以採用工藝替代:確保你的腳本錯誤
logger -i <(rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup > /dev/null)
您可以通過添加2>&1
,例如重定向STDERR描述符(2)到標準輸出(1):
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup 2>&1 | logger -i
這是2&1它是做什麼的。 – 2010-03-26 14:51:19
@James right;編輯澄清這一點 – 2010-03-26 15:04:03
另一種方式被捕獲以及的rsync錯誤,是這樣做的:
#!/bin/bash
set -eu
set -o pipefail
exec 1>/dev/null 2> >(logger -t "stderr-from-my-script")
: do some interesting things
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup
: do some other interesting things
現在,所有寫入到stderr的數據都將被記錄,而不僅僅是來自rsync的數據。但是,在調試時忽略stdout
通常是一個壞主意,因爲有用的信息可能會突出顯示錯誤的原因可能會記錄在那裏。如果你想stderr和標準輸出進行區分,只是不穿越流:
exec 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
顯式地關閉手柄或恢復它們,考慮以下因素:
exec {OLD_STDOUT}>&1 {OLD_STDERR}>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
: Do some interesting things
eval exec 1>&${OLD_STDOUT} 2>&${OLD_STDERR} ${OLD_STDOUT}>&- ${OLD_STDERR}>&-
對於舊版本的bash,你可能必須更直接一點:
exec 3>&1 4>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
: Do some interesting things
exec 1>&3 2>&4 3>&- 4>&-
感謝您向我展示n>>(dothis ...)構造。 – fbicknel 2016-05-18 15:16:08
也許你的意思是「既stdout和stderr」而不是「STDERR代替」。 – 2010-03-26 16:04:01
其實我只是在stderr之後,因爲它不應該產生任何輸出。 – Gnutt 2010-03-26 16:47:04