Запуск rclone sync с помощью systemd

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

Я надеюсь, у вас у всех отличный день. Я сломал голову, пытаясь сделать что-то, что первоначально казалось мне простым, запустить rclone для синхронизации моих файлов с Google при завершении работы компьютера. Я знаю, что большинство людей рекомендует автоматически запускать скрипт rclone с помощью cron, но я не работаю в обычные часы и у меня нет компьютера, работающего весь день, поэтому запланированная задача не подходит. Rclone у меня работает отлично, я могу вручную запускать скрипты резервного копирования.

Я пытаюсь сделать это с помощью systemd, следуя этим инструкциям Как запустить скрипт перед завершением работы в Systemd

После решения некоторых проблем я зашел в тупик, потому что systemd не может найти файл rclone.conf. Мой rclone.conf находится здесь:

/home/barry/.config/rclone/rclone.conf

но systemd ищет rclone.conf в /root, поэтому он не находит его. Думаю, мне нужно добавить какие-то инструкции в скрипт или unit файл, но я не уверен, что делать.
Простой скрипт для тестирования:

#!/bin/bash 
rclone sync -v --create-empty-src-dirs /$HOME/Documents Google:Documents

Unit файл:

[Unit]
Description=Выполнить пользовательский скрипт перед выключением системы
DefaultDependencies=no
Before=shutdown.target 

[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/system-shutdown/backup.sh
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

Состояние Systemctl с ошибкой “NOTICE: Config file “/root/.config/rclone/rclone.conf” not found – using defaults”

arry@barryubuntu:~$ systemctl status execute-before-shutdown.service
× execute-before-shutdown.service - Выполнить пользовательский скрипт перед выключением системы
     Loaded: loaded (/etc/systemd/system/execute-before-shutdown.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Fri 2025-02-14 18:48:01 -05; 2min 22s ago
    Process: 10732 ExecStart=/usr/lib/systemd/system-shutdown/backup.sh (code=exited, status=1/FAILURE)
   Main PID: 10732 (code=exited, status=1/FAILURE)
        CPU: 70ms

Feb 14 18:48:01 barryubuntu systemd[1]: Starting execute-before-shutdown.service - Выполнить пользовательский скрипт перед выключением системы...
Feb 14 18:48:01 barryubuntu backup.sh[10733]: NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
Feb 14 18:48:01 barryubuntu backup.sh[10733]: CRITICAL: Failed to create file system for "Google:/Documents": не найдена секция в конфигурационном файле
Feb 14 18:48:01 barryubuntu systemd[1]: execute-before-shutdown.service: Главный процесс завершен с кодом выхода, status=1/FAILURE
Feb 14 18:48:01 barryubuntu systemd[1]: execute-before-shutdown.service: Завершено с результатом 'exit-code'.
Feb 14 18:48:01 barryubuntu systemd[1]: Не удалось запустить execute-before-shutdown.service - Выполнить пользовательский скрипт перед выключением системы.

Хорошо, если есть лучший способ сделать это без systemd, я с удовольствием его последую! Спасибо

Ответ или решение

Запуск rclone для синхронизации файлов с использованием systemd на этапе выключения системы может показаться сложной задачей, особенно если возникли проблемы с поиском конфигурационного файла rclone.conf. Ниже мы подробно разберем, как можно решить эту задачу и какие шаги следует предпринять для успешного выполнения скрипта синхронизации файлов перед выключением системы.

Теория

Когда вы используете systemd для выполнения скриптов на различных этапах работы системы (например, до выключения), важно понимать контекст выполнения и права доступа. Проблема, с которой вы столкнулись, связана с тем, что systemd запускает скрипты от имени пользователя root по умолчанию, и, следовательно, он ищет конфигурационные файлы в каталоге root. Однако ваш файл rclone.conf находится в пользовательском каталоге, и для решения этой проблемы необходимо передать systemd правильное окружение пользователя, включая конфигурационный путь.

Пример

Ваша текущая конфигурация unit-файла выглядит следующим образом:

[Unit]
Description=Execute custom script before system poweroff
DefaultDependencies=no
Before=shutdown.target 

[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/system-shutdown/backup.sh
TimeoutStartSec=0

[Install]
WantedBy=shutdown.target

Скрипт backup.sh:

#!/bin/bash 
rclone sync -v --create-empty-src-dirs /$HOME/Documents Google:Documents

Ошибки возникают потому, что systemd не может найти rclone.conf в ожидаемом каталоге /root/.config/rclone/rclone.conf.

Применение

Для решения проблемы вам необходимо внести изменения в скрипт и, возможно, в unit-файл. Вот пошаговые рекомендации:

  1. Использование переменной окружения RCLONE_CONFIG_PATH:
    Вам необходимо указать rclone, где искать конфигурационный файл. Это можно сделать, установив переменную окружения RCLONE_CONFIG_PATH в вашем скрипте backup.sh.

    Обновите ваш скрипт backup.sh следующим образом:

    #!/bin/bash 
    export RCLONE_CONFIG_PATH=/home/barry/.config/rclone/rclone.conf
    rclone sync -v --create-empty-src-dirs /home/barry/Documents Google:Documents
  2. Изменение прав доступа и владельца:
    Убедитесь, что у скрипта backup.sh есть права на выполнение, и он выполнен от имени правильного пользователя. Вы можете сменить пользователя, от имени которого будет выполняться процесс, добавив директиву User=barry в секцию [Service] вашего unit-файла.

    Обновленный unit-файл может выглядеть следующим образом:

    [Unit]
    Description=Execute custom script before system poweroff
    DefaultDependencies=no
    Before=shutdown.target 
    
    [Service]
    Type=oneshot
    ExecStart=/usr/lib/systemd/system-shutdown/backup.sh
    TimeoutStartSec=0
    User=barry
    Environment=RCLONE_CONFIG_PATH=/home/barry/.config/rclone/rclone.conf
    
    [Install]
    WantedBy=shutdown.target
  3. Проверка systemd конфигурации и перезапуск:
    После внесения изменений проверьте синтаксис вашего нового unit-файла с помощью команды:

    sudo systemd-analyze verify /etc/systemd/system/execute-before-shutdown.service

    Если все в порядке, обновите и перезапустите конфигурацию systemd:

    sudo systemctl daemon-reload
    sudo systemctl enable execute-before-shutdown.service

    Чтобы протестировать выполнение скрипта, вы можете запустить его вручную или использовать команду systemctl start execute-before-shutdown.service.

  4. Полезные советы:

    • Убедитесь, что rclone настроен правильно и имеет необходимые права доступа на доступ к Google Drive.
    • Убедитесь, что ваш скрипт исполняемый: chmod +x /usr/lib/systemd/system-shutdown/backup.sh.
    • Для отладки вы можете добавлять дополнительные команды echo в скрипт, чтобы увидеть, какие пути переменных используются.

Следуя этим рекомендациям, вы сможете настроить выполнение rclone для синхронизации файлов перед выключением компьютера. Также стоит помнить, что использование systemd – это гибкий способ автоматизации задач, который позволяет уходить от фиксированных расписаний в пользу событийных процессов. Это дает возможность всесторонне контролировать операции, что крайне удобно, когда машин выполняет задачи не по расписанию, а в зависимости от событий.

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

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