2010-03-26 79 views
5

我使用rsync通過SSH編寫bash腳本來執行異地備份。我能夠通過發送STDERR到記錄器

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup | logger -i 

發送到標準輸出記錄,原木,但我想給STDERR代替,因此,如果出現了問題,如異地是不可用的,該輸出應該發送到記錄器並記錄。

+0

也許你的意思是「既stdout和stderr」而不是「STDERR代替」。 – 2010-03-26 16:04:01

+0

其實我只是在stderr之後,因爲它不應該產生任何輸出。 – Gnutt 2010-03-26 16:47:04

回答

5

如果你想標準錯誤而不是標準輸出(而不是標準錯誤和標準輸出),你可以做以下內容:

  1. 打開另一個文件描述符(9)
  2. 重定向標準輸出(1)至新的文件描述符(9)
  3. stderr重定向(2)至沙田民政事務處UT(1)

,看起來像這樣:

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) 
6

您可以通過添加2>&1,例如重定向STDERR描述符(2)到標準輸出(1):

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup 2>&1 | logger -i 
+0

這是2&1它是做什麼的。 – 2010-03-26 14:51:19

+0

@James right;編輯澄清這一點 – 2010-03-26 15:04:03

2

另一種方式被捕獲以及的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>&- 
+0

感謝您向我展示n>>(dothis ...)構造。 – fbicknel 2016-05-18 15:16:08

相關問題