Устройство с USB-портом для пользовательского хранилища - как определить / как разрешить небезопасное отключение?

Я не мог контролировать стоп с PartOf = , а A не должен остановитесь на B , поэтому в итоге я использовал Переопределение настроек поставщика , похоже, работает.

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/ cmd реализация асинхронна и имеет доступ к ресурсу, к которому /script.sh также требуется доступ, Я не нашел ничего лучше (пока), чтобы поспать несколько секунд.

Я пробовал использовать systemctl [--no-block] try-restart перед непосредственным использованием /script.sh , но это не сработало.

2
01.01.2017, 00:30
1 ответ

Для (1) я бы посоветовал взглянуть на удиски - они уже многое решили за вас. Включая такие вещи, как «что произойдет, если пользователь подключит два запоминающих устройства?» (помните: концентраторы USB и, конечно же, некоторые устройства представляют собой несколько устройств). udisks позволяет вам легко находить доступные устройства, получать уведомления, когда они становятся доступными (или удаляются), проверять различные атрибуты устройств и т. д. Он также будет выполнять монтаж за вас, включая поддержку большого количества файловых систем.

Для (2), если возможно, я бы отключил устройство между операциями записи. Если нет, вы можете смонтировать его в режиме sync и / или dirsync , это должно помочь - это должно поддерживать файловую систему в согласованном состоянии между записями. Кроме того, если вы пишете в заранее выделенное пространство, это часто не будет включать (или, по крайней мере, минимальное, только mtime) изменение метаданных файловой системы. (Когда вы создаете журнал, запишите 10 МБ нулей; затем вернитесь к началу и выполните потоковую передачу данных в него. Когда вы нажмете 10 МБ, создайте еще один журнал. Только нечастая операция create действительно рискует повреждением файловой системы.)

Как Джули Однако Пеллетье отметил, что предпочтительнее использовать какую-нибудь кнопку извлечения.

Также, в качестве примечания, если вы можете заставить внешнее приложение записывать свои данные в канал (включая именованный канал, созданный с помощью mkfifo ), тогда ваш код может читать из канала и обрабатывать фактические записать на USB. То же самое применимо, если у вас есть внешнее приложение, записывающее во временный файл в tmpfs.

3
27.01.2020, 22:03

Теги

Похожие вопросы