簡體   English   中英

我如何tar另一個進程正在使用的文件?

[英]How can I tar a file that is being used by another process?

我正在歸檔一個目錄。 此目錄有一個由另一個進程寫入的文件。 當我使用Linux tar / Perl Tar模塊對此進行tar時,在歸檔中文件的條目存在,但內容為null。

在tarring文件之前......

-rw-r--r--  1 irraju dba 28 Feb 18 02:22 a
-rw-r--r--  1 irraju dba 25 Feb 18 02:23 b
-rw-r--r--  1 irraju dba 29 Feb 18 03:38 c

解開后

-rw-r--r-- irraju/dba       28 2009-02-18 02:22:58 a
-rw-r--r-- irraju/dba       25 2009-02-18 02:23:17 b
-rw-r--r-- irraju/dba        0 2009-02-18 03:33:12 c

我該如何解決這個問題? 我希望文件在存檔中包含存檔時的內容。 此文件可以是日志文件,並假設我們無法在tarring之前關閉文件句柄。

當您使用“Linux”標記問題時,您可能正在使用LVM分區。 如果您確實在LVM分區上運行,則可以使用LVM快照功能。

以下是有關如何執行操作的相關LVM文檔的鏈接。

這是LVM快照介紹的一部分:

LVM提供的一個很棒的設施是“快照”。 這允許管理員創建一個新的塊設備,該設備提供在某個時間點凍結​​的邏輯卷的精確副本。 通常,當需要在邏輯卷上執行某些批處理(例如備份)但您不想暫停正在更改數據的實時系統時,將使用此方法。 快照設備完成后,系統管理員只需刪除該設備即可。 此工具確實要求在邏輯卷上的數據處於一致狀態時創建快照 - LVM1的VFS鎖定補丁確保某些文件系統在創建快照時自動執行此操作,並且許多2.6內核中的文件系統在沒有修補的情況下創建快照時自動執行此操作。

嘗試先復制文件...

cp a a.tmp
cp b b.tmp
cp c c.tmp

...然后把所有東西拼湊起來......

tar *.tmp abc.tar

......並清理:

rm *.tmp

如果這不起作用,則持有文件句柄的進程不希望共享讀訪問權限...

您可能會發現這取決於所使用的文件系統和訪問該文件的應用程序。 最接近通用解決方案的是使用支持快照的文件系統並在運行tar之前創建快照。

你的第二個輸出是你的第一個輸出之后產生的,這是不對的。 我猜測tar就在這里:當它正在完成它的工作時,文件是空的。 你可能在這里處理競爭條件。

正如其他人所說,這取決於所使用的文件系統和操作系統。 首先sync (或文件系統上的等效文件),將文件復制到臨時目錄,然后將它們tar起來。 如果文件系統不允許您復制打開的文件,那么您就是SOL; Perl無法解決文件系統限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM