Я не мог контролировать стоп
с 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
, но это не сработало.
Для (1) я бы посоветовал взглянуть на удиски - они уже многое решили за вас. Включая такие вещи, как «что произойдет, если пользователь подключит два запоминающих устройства?» (помните: концентраторы USB и, конечно же, некоторые устройства представляют собой несколько устройств). udisks позволяет вам легко находить доступные устройства, получать уведомления, когда они становятся доступными (или удаляются), проверять различные атрибуты устройств и т. д. Он также будет выполнять монтаж за вас, включая поддержку большого количества файловых систем.
Для (2), если возможно, я бы отключил устройство между операциями записи. Если нет, вы можете смонтировать его в режиме sync
и / или dirsync
, это должно помочь - это должно поддерживать файловую систему в согласованном состоянии между записями. Кроме того, если вы пишете в заранее выделенное пространство, это часто не будет включать (или, по крайней мере, минимальное, только mtime) изменение метаданных файловой системы. (Когда вы создаете журнал, запишите 10 МБ нулей; затем вернитесь к началу и выполните потоковую передачу данных в него. Когда вы нажмете 10 МБ, создайте еще один журнал. Только нечастая операция create действительно рискует повреждением файловой системы.)
Как Джули Однако Пеллетье отметил, что предпочтительнее использовать какую-нибудь кнопку извлечения.
Также, в качестве примечания, если вы можете заставить внешнее приложение записывать свои данные в канал (включая именованный канал, созданный с помощью mkfifo
), тогда ваш код может читать из канала и обрабатывать фактические записать на USB. То же самое применимо, если у вас есть внешнее приложение, записывающее во временный файл в tmpfs.