2012-12-28 43 views
0

或者:如何防止sudo'ed rsync在while循環中無限觸發? 因爲這是兩個(感覺)發生,我不明白。爲什麼在while循環中使用時,sudo會將阻塞命令更改爲非阻塞命令?

我想設置一個手錶同步修改的文件,它工作正常。但是,一旦我將所需的sudo引入到rsync命令中,單個inotify事件將導致rsync命令無限期激發。

#!/usr/bin/env bash 
inotifywait -m -r --format '%w%f' -e modify -e move -e create -e delete /var/test | while read line; do 
    sudo rsync -ah --del --progress --stats --update "$line" "/home/test/" 
done 

當您編輯文件時,rsync進入快速啓動模式。但是丟失sudo(並且使用您有權訪問的文件夾),並且該腳本按預期工作。

  1. 這是爲什麼?
  2. 如何使sudo命令正確工作?
+0

當您應用sudo的,我懷疑rsync的等待密碼輸入。這就是你認爲rsync無限期運行的原因。你嘗試過,在命令提示符下運行sudo'ed rsync作爲獨立命令嗎?它要求輸入密碼嗎?如果是,您可能想使用expect命令來自動輸入密碼。 – Icarus3

+0

該命令工作正常,沒有密碼 - 我'rsync'允許'sudoers'與'nopassword'。該命令也可以正確執行,並同步文件。但它一直在做,直到我打破劇本。 – Redsandro

+0

啊!有你的問題!當編輯任何文件時,大部分編輯器都會創建交換文件,甚至更新時間戳。這會發出許多修改通知給「inotifywait」,您應該傳遞「-e close_write」切換到inotifywait命令。實際上,只是不要尋找修改。見,http://stackoverflow.com/questions/10300835/too-many-inotify-events-while-editing-in-vim – Icarus3

回答

1

我有答案,通過實驗發現它。但我不知道這是爲什麼。請有人告訴我爲什麼sudo在此循環中打破預期的阻止行爲。
這是正確的:

由於sudo斷腳本,我們可以通過使用包裝從sudo保持距離

inotifywait -m -r --format '%w%f' -e modify /var/test | while read line; do 
    sh -c 'sudo rsync -ah "$line" "/home/test/"' 
done 

奇怪的是:拉sudo出包裝的,我們有舊的錯誤行爲再次發生。很奇怪。
這是錯誤的:

inotifywait -m -r --format '%w%f' -e modify /var/test | while read line; do 
    sudo sh -c 'rsync -ah "$line" "/home/test/"' 
done