Запустить сервис systemd только после завершения автоматического монтирования GNOME

Вопрос или проблема

У меня есть служба 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. Вы можете использовать его статус для запуска вашего сервиса.

Вот пошаговое руководство, как это сделать:

  1. Создание пользовательского сервиса:

    Создайте файл сервиса в ~/.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.

  2. Проверка наличия точек монтирования:

    Добавьте логику в ваш скрипт (например, ваш_скрипт.sh), чтобы он проверял наличие необходимых директорий во время выполнения. Можно использовать цикл для проверки существования монтирований:

    #!/bin/bash
    
    # Проверка, есть ли монтирование USB
    while [ ! "$(ls -A /media/my_username/)" ]; do
       sleep 1
    done
    
    # Тут запускаем основную часть вашего скрипта
    # ...

    Это гарантирует, что ваш сервис не завершится до тех пор, пока нужные директории не будут доступны.

  3. Перезагрузка systemd и активация сервиса:

    После создания файла сервиса выполните следующие команды:

    sudo systemctl daemon-reload
    sudo systemctl enable my-service.service

    Теперь ваш сервис будет автоматически запущен после завершения монтирования USB-устройств.

  4. Тестирование:

    Перезагрузите компьютер и проверьте, что ваш сервис запускается корректно после монтирования устройств. Убедитесь, что в /media/my_username/ вы видите ожидаемые монтирования, когда ваш сервис запускается.

Таким образом, используя механизм systemd и udisks2, вы сможете надежно управлять порядком запуска вашего сервиса в зависимости от успешности монтирования USB-устройств.

Оцените материал
Добавить комментарий

Капча загружается...