'dosya adı' normal bir dosya oluşturamıyor: dosya var


23

Bu garip hata mesajını benim derleme betiğimden birinde cpalıyorum - "Dosya var" hatası veriyor. Kullanmayı denedim cp -f, eğer varsa dosyanın üzerine yazmalı, ancak hata hala görünüyor. Koşu cpben elle yaparken üzerine yazma mevcut dosyalara mükemmel çalışıyor. Bu hataya ne sebep olabilir?

Yanıtlar:


25

Bunun bir yarış koşulundan kaynaklandığı ortaya çıktı. cpHedef dosyanın zaten var olup olmadığını kontrol eder ve değilse - üzerine yazar. Sorun, bu cpkomutun iki kez paralel olarak çalıştırılmasından kaynaklanıyordu; bu, söz konusu dosyanın bazen var olup olmadığını kontrol ettikten sonra , ancak dosyayı oluşturma girişiminden önce görünmesine neden oldu . straceÇıktı aşağıdaki gibidir:

# 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)

İşte bunu yakalamak için kullanılan bazı bash kodu:

#!/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

Bu aynı hata, mkdir -pbir dosyanın üzerine yazmaya çalışan herhangi bir eylemle veya başka bir eylemle ortaya çıkabilir . Kullanılması flockböyle durumlarda önlemek yarış koşulları yardımcı olabilir.


Ben de aynı durumla karşılaştım. ||Operatör aracılığıyla idare etmeyi seçtim . Bir çeşit fakir adamın deneme / yakalama. Yani cp ... || echo "skip copying due to other thread",. Ya da benzer bir şey ...
— icfantv

Tek bir süre çalışırken bu konuya cp
— değindim

Aynı problemle karşılaştım. Nasıl hata ayıkladın?
— CIsForCookies

Başarısız olanları engelliyor cp.
— Lutzky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.