У мене є частина сценарію 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)
Що може призвести до появи цієї відмови ??
@AFH чи можете ви мені сказати, чи є помилка в сценарії, де
—
користувач322908
syncце необхідно, щоб сценарій був правильним? Іншими словами, чи syncзавжди потрібно дзвонити між двома командними оболонками, що залежить від дії один одного на файлову систему? Хочу знати, чи це моя помилка, чи це помилка в ядрі Linux та / або реалізація cp, яку можна усунути за допомогою використання sync.
Оновлення до новітнього випуску CentOS 6.7. Потім перевірте, чи помилка все-таки виникає.
—
Кіра
@Cyrus спасибі, я можу це зробити, але, будь ласка, уважно прочитайте моє запитання - це мається на увазі буквально. Мене не так цікавить "спробуйте х і подивіться, чи проблема зникне", тому що це не принесе мені розуміння того, що відбувається. Я хочу зрозуміти, що відбувається в першу чергу, і виходячи з цього, я можу потім "зробити правильно".
—
user322908
@ user322908 - Це, звичайно, не помилка скрипту, і лише здогадка, що це може бути помилка кешування: вставлення
—
AFH
syncнадасть деякі свідчення останнього. Якщо так, то кеш може бути в драйвері диска або в самому контролері диска (це я відчував кілька років тому, а дискові диски довелося замінити виробником). На жаль, я запускаю Ubuntu, який базується на Debian, тоді як CentOS заснований на RedHat, тому я не можу запускати жодних значущих тестів. Я дав вам можливу причину, як ви запитали: я не впевнений, що зможу зробити більше.
rmякcpбуде виконано. Можливо, дзвінокsyncміж двома командами вилікує це.