Cp
無法創建正常文件“文件名”:文件存在
我在我的一個建構腳本中收到了這個奇怪的錯誤消息 -
cp
失敗,返回錯誤“文件存在”。我什至嘗試過使用cp -f
,如果文件存在,它應該覆蓋文件,但錯誤仍然出現。cp
當我手動執行時,執行以覆蓋現有文件非常有效。什麼可能導致此錯誤?
事實證明,這是由競爭條件引起的。
cp
檢查目標文件是否已經存在,如果不存在 - 覆蓋它。問題的發生是因為此cp
命令並行執行兩次,這導致有問題的文件有時會在檢查它是否存在之後出現,但在嘗試創建文件之前出現。strace
輸出如下所示:# Command was "cp a b" stat("b", 0x7fff89510620) = -1 ENOENT (No such file or directory) stat("a", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 stat("b", 0x7fff895103a0) = -1 ENOENT (No such file or directory) # File b will be created at this point in time open("a", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 open("b", O_WRONLY|O_CREAT|O_EXCL, 0644) = -1 EEXIST (File exists)
這是一些用於擷取此問題的 bash 程式碼:
#!/bin/bash touch a f() { while true; do rm -f b strace -o /tmp/cp${BASHPID}.trace cp a b || break done } cleanup() { kill -9 %1 %2 } f & f & trap cleanup exit wait
mkdir -p
嘗試覆蓋文件的任何其他操作或任何其他操作都可能發生同樣的錯誤。在這種情況下,使用flock
可以幫助避免競爭條件。