'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.