Я запускаю Docker-контейнер на ПЛК WAGO PFC200 (специальная встроенная прошивка Linux).
Контейнер запускает скрипт Python, который собирает системную информацию, такую как загрузка процессора, использование памяти и т. д., и записывает ее в файл .json. Этот процесс повторяется через 3 секунды в бесконечном цикле while.
Файл записывается в созданный подкаталог файловой системы контейнера «/app/out», который смонтирован в «/tmp». файловой системы Linux.
Цель
Открыть и циклически прочитать json-файл из программы, работающей в среде выполнения codesys на контроллере.< /p>
Проблема
При открытии файла .json бывают случаи, когда файл json является синтаксически неверным. Это происходит при тестировании программы ПЛК в Codesys IDE, а также при открытии файла из файлового браузера mobaXterm (браузер файлов FTP). Однако проблема так и не возникла, когда я открыл файл в SSH-сеансе с помощью NANO.
3 примера неправильных файлов:
Код: Выделить всё
{
"Operating System": "Linux",
"CPU Load": 26.0,
"CPU Average Load (1, 5, 15 minutes)": [
1.48828125,
2.6689453125,
2.6484375
],
"Total RAM": 512839680,
"Used RAM": 99794944,
"Shared RAM": 3022848,
"Total Swap Size": 0,
"Available Swap Size": 0
}e": 0
}
{
"Operating System": "Linux",
"CPU Load": 14.9,
"CPU Average Load (1, 5, 15 minutes)": [
1.5234375,
1.2978515625,
1.8134765625
],
"Total RAM": 512839680,
"Used RAM": 96014336,
"Shared RAM": 3035136,
"Total Swap Size": 0,
"Available Swap Size": 0
} 0
}
{
"Operating System": "Linux",
"CPU Load": 32.0,
"CPU Average Load (1, 5, 15 minutes)": [
1.1513671875,
1.2685546875,
1.265625
],
"Total RAM": 512839680,
"Used RAM": 98611200,
"Shared RAM": 3125248,
"Total Swap Size": 0,
"Available Swap Size": 0
}": 0
}
- Неправильные файлы всегда имеют часть к ним добавляется конец самого json (например, "e": 0
}") - Эта ошибка всегда сопровождается из-за долгой загрузки и экрана загрузки:
введите описание изображения здесь - Это происходит примерно каждый 5-10-й раз при открытии файл
Кажется иметь какое-то отношение к файлу, в который записывается, одновременно с его открытием и чтением.
Что я уже пробовал
- Добавление «fctnl» в скрипт Python
Код: Выделить всё
def write_to_json(data, filename):
with open(filename, 'w') as file:
try:
# Acquire an exclusive lock on the file
print("Acquiring lock...")
fcntl.flock(file, fcntl.LOCK_EX)
print("Lock acquired.")
# Write the system information to the file
json.dump(data, file, indent=4)
# Ensure data is written to disk
file.flush()
os.fsync(file.fileno())
finally:
# Release the lock
print("Releasing lock...")
fcntl.flock(file, fcntl.LOCK_UN)
print("Lock released.")
- пытаемся зарегистрировать операции с файлом с помощью strace
- пытаемся зарегистрировать операции консольной команды «flock»
- Все «отладочные» отпечатки («Получение блокировки...» и т. д.) циклически появляются в консоли контейнера
- Проблема все еще сохраняется
- strace показывает только открытие, чтение, запись и т. д., но не блокировка
- Я не могу использовать вместо этого «auditd», так как он не установлен, и я не могу установить новые пакеты
- Есть ли какой-нибудь другой способ отследить операции блокировки файлов, чтобы проверить, работает ли fcntl скрипта?
- Может ли вообще работает, потому что файл записывается в смонтированный каталог, а сценарий Python не «достигает» файловой системы Linux при своем вызове?
- Есть ли какие-либо другой способ ограничить чтение и запись файла одновременно (если это вообще проблема)?
- Какие еще причины могут привести к показанному поведению?
Надеюсь, я добавил всю необходимую информацию. Дайте мне знать, если вам нужен сам код или что-нибудь еще.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -container