2016-11-23 64 views
0

我有一個腳本,它從一個輸入文件中逐個獲取服務器列表,並在每個服務器上執行一些命令。我希望能夠在腳本運行時更新輸入文件,而不影響第一個進程的輸入,然後用第二個服務器列表重新運行腳本。這可以安全地完成嗎?什麼時候進程獲取文件來讀取

+0

我相信你問「如果我在程序讀取時寫入文件,會發生什麼?*」 - 是否正確? – dimo414

+0

是的,我有興趣知道,當一個進程獲取所有的資源,如從這裏的文件輸入.. –

+0

現在寫入輸入文件,替換輸入文件的全部內容 –

回答

0

當運行等file > my_script位於file的內容的命令被管道輸送到my_script(作爲file descriptor)。這將名稱中的內容分離出來,這意味着您可以在另一個過程中立即修改/替換file

如果改爲像my_script file你傳遞的「文件」,以my_script,這可以從該文件在任何時候讀取(或寫,刪除等)運行命令,因此你在腳本運行時無法安全地更改file。值得注意的是,這不會立即發生;長時間運行的進程可能不會從file讀取,直到很久以後,在您編輯完文件後。

因此,如果您設計程序以從標準輸入讀取,您可以安全地修改輸入文件並在第一個進程仍在運行時重新運行該命令。

+0

謝謝dimo .. –

+0

@AravindVijayan很高興能幫到你! – dimo414

0

假設你的進程正在運行,如果你想改變文件,只需將文件mv放在一邊,並複製新的輸入文件。這樣,如果進程沒有將輸入文件完全讀入內存,它仍然會有一個文件描述符對前一個文件開放,並且不會受到影響。當然,這一切都取決於過程是如何實現的,如果它在執行過程中試圖重新打開文件,它會看到新的文件內容。

process inputfile 
mv inputfile inputfile.running 
mv newinput inputfile 
+0

謝謝,考慮在bash腳本中有一個for循環來逐個讀取服務器名稱,我想我們可以從輸入文件中刪除實體提供新的服務器名稱並運行同一腳本的另一個實例 –

相關問題