як файл можна видалити, а потім cp не може записати його?


1

У мене є частина сценарію bash, який я виконую як root:

rm -f ../../include/profile.h; \
cp profile.h ../../include/profile.h

відповідний файл ../../include/profile.hмає дозволи:

-rw-r--r-- 1 root root 12178 Nov  5 02:00 ../../include/profile.h

Більшу частину часу фрагмент виконує добре, але дуже рідко неможливо відтворити, він не вдається:

cp: cannot create regular file `../../include/profile.h': File exists

Я перевірив, що немає іншої частини програми, яка би виконувалася паралельно, яка могла б записати файл між двома заявами, створивши таким чином умову перегону, яка пояснювала б поведінку. Немає іншого місця, ніж вище, яке виконується лише один раз, яке б написало цей файл.

Система є

ядро:

Linux dev64 2.6.32.63+drm33.26-64.128-a10 #6 SMP Fri Jul 25 15:21:56 PDT 2014 x86_64 x86_64 x86_64 GNU/Linux

distro:

CentOS release 6.3 (Final)

Що може призвести до появи цієї відмови ??


Єдине, що спадає на думку, - це кешування записів на диску, яке може не завершитися після того, rmяк cpбуде виконано. Можливо, дзвінок syncміж двома командами вилікує це.
AFH

@AFH чи можете ви мені сказати, чи є помилка в сценарії, де syncце необхідно, щоб сценарій був правильним? Іншими словами, чи syncзавжди потрібно дзвонити між двома командними оболонками, що залежить від дії один одного на файлову систему? Хочу знати, чи це моя помилка, чи це помилка в ядрі Linux та / або реалізація cp, яку можна усунути за допомогою використання sync.
користувач322908

Оновлення до новітнього випуску CentOS 6.7. Потім перевірте, чи помилка все-таки виникає.
Кіра

@Cyrus спасибі, я можу це зробити, але, будь ласка, уважно прочитайте моє запитання - це мається на увазі буквально. Мене не так цікавить "спробуйте х і подивіться, чи проблема зникне", тому що це не принесе мені розуміння того, що відбувається. Я хочу зрозуміти, що відбувається в першу чергу, і виходячи з цього, я можу потім "зробити правильно".
user322908

@ user322908 - Це, звичайно, не помилка скрипту, і лише здогадка, що це може бути помилка кешування: вставлення syncнадасть деякі свідчення останнього. Якщо так, то кеш може бути в драйвері диска або в самому контролері диска (це я відчував кілька років тому, а дискові диски довелося замінити виробником). На жаль, я запускаю Ubuntu, який базується на Debian, тоді як CentOS заснований на RedHat, тому я не можу запускати жодних значущих тестів. Я дав вам можливу причину, як ви запитали: я не впевнений, що зможу зробити більше.
AFH

Відповіді:


0

Використовуйте

strace cp profile.h ../../include/profile.h 2>logfile

і шукайте:

stat("../../include/profile.h", 0x7ffdca347950) = -1 ENOENT (No such file or directory)
open("../../include/profile.h", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4

Це підкаже, що відбувається. У цьому прикладі файл не існував до cp (який він визначив), отже, O_CREAT | O_EXCL.

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