не вдається створити звичайний файл "ім'я файлу": файл існує


23

Я отримував це дивне повідомлення про помилку в одному зі своїх скриптів побудови - cpне вдається, повертаючи помилку "Файл існує". Я навіть намагався використовувати cp -f, який повинен перезаписати файл, якщо він існує, але помилка все-таки виявляється. Запуск cpперезапису існуючих файлів працює чудово, коли я це роблю вручну. Що може спричинити цю помилку?

Відповіді:


25

Це виявилося причиною перегонів. 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)

Ось кілька баш-кодів, які використовуються для цього:

#!/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може допомогти уникнути перегонів у таких випадках.


Я зіткнувся з цією самою ситуацією. Я вирішив обробляти це через ||оператора. Сорт спроби / улову бідняка. Тобто, cp ... || echo "skip copying due to other thread". Або щось подібне ...
icfantv

Я потрапив у цю проблему під час запуску синглуcp
ZhaoGang

Зустрічався з тією ж проблемою. Як ви це налагодили?
CIsForCookies

Потрапив на провал cp.
Луцький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.