Вопрос или проблема
У меня есть служба systemd, которая требует, чтобы usb-устройства автоматически монтировались перед её запуском. Мои usb-устройства автоматически монтируются в /media/my_username/
В настоящее время я использую sleep 10 + автоматический вход, но в редких случаях автоматическое монтирование завершается только после этого. Поэтому, когда я выполняю ls /media/my_username/
, я получаю пустую директорию.
Я пробовал использовать RequiresMountsFor=/media/my_username/
, но это не сработало.
Я видел много решений с использованием fstab, но в моем случае я не знаю, какое устройство будет (или не будет) подключено.
Я также пробовал использовать Requires=local-fs.target
и After=local-fs.target
без успеха.
Ответ или решение
Для решения задачи запуска сервиса systemd после завершения автоматического монтирования USB-устройств, вам необходимо создать зависимость вашего сервиса от механизма монтирования, используемого в GNOME. Вместо использования устаревшего метода с sleep
, который не гарантирует успешного монтирования, рекомендуется использовать индикацию готовности системы.
В GNOME автоматическое монтирование устройств зачастую управляется через udisks2
и соответствующий сервис udisksd
. Вы можете использовать его статус для запуска вашего сервиса.
Вот пошаговое руководство, как это сделать:
-
Создание пользовательского сервиса:
Создайте файл сервиса в
~/.config/systemd/user/
или в/etc/systemd/system/
, в зависимости от того, нужна ли вам система для всех пользователей или только для конкретного.Например, создайте файл
/etc/systemd/system/my-service.service
со следующим содержимым:[Unit] Description=Мой сервис, ожидающий автоматическом монтировании USB After=udisks2.service Wants=udisks2.service [Service] Type=simple ExecStart=/путь/к/вашему/скрипту.sh Restart=on-failure [Install] WantedBy=default.target
Обратите внимание на директиву
After=udisks2.service
, которая обеспечивает запуск вашего сервиса только после того, как завершится работаudisks2
. -
Проверка наличия точек монтирования:
Добавьте логику в ваш скрипт (например,
ваш_скрипт.sh
), чтобы он проверял наличие необходимых директорий во время выполнения. Можно использовать цикл для проверки существования монтирований:#!/bin/bash # Проверка, есть ли монтирование USB while [ ! "$(ls -A /media/my_username/)" ]; do sleep 1 done # Тут запускаем основную часть вашего скрипта # ...
Это гарантирует, что ваш сервис не завершится до тех пор, пока нужные директории не будут доступны.
-
Перезагрузка systemd и активация сервиса:
После создания файла сервиса выполните следующие команды:
sudo systemctl daemon-reload sudo systemctl enable my-service.service
Теперь ваш сервис будет автоматически запущен после завершения монтирования USB-устройств.
-
Тестирование:
Перезагрузите компьютер и проверьте, что ваш сервис запускается корректно после монтирования устройств. Убедитесь, что в
/media/my_username/
вы видите ожидаемые монтирования, когда ваш сервис запускается.
Таким образом, используя механизм systemd
и udisks2
, вы сможете надежно управлять порядком запуска вашего сервиса в зависимости от успешности монтирования USB-устройств.