Вопрос или проблема
Я надеюсь, у вас у всех отличный день. Я сломал голову, пытаясь сделать что-то, что первоначально казалось мне простым, запустить 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-файл. Вот пошаговые рекомендации:
-
Использование переменной окружения 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
-
Изменение прав доступа и владельца:
Убедитесь, что у скрипта 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
-
Проверка 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
. -
Полезные советы:
- Убедитесь, что rclone настроен правильно и имеет необходимые права доступа на доступ к Google Drive.
- Убедитесь, что ваш скрипт исполняемый:
chmod +x /usr/lib/systemd/system-shutdown/backup.sh
. - Для отладки вы можете добавлять дополнительные команды echo в скрипт, чтобы увидеть, какие пути переменных используются.
Следуя этим рекомендациям, вы сможете настроить выполнение rclone для синхронизации файлов перед выключением компьютера. Также стоит помнить, что использование systemd – это гибкий способ автоматизации задач, который позволяет уходить от фиксированных расписаний в пользу событийных процессов. Это дает возможность всесторонне контролировать операции, что крайне удобно, когда машин выполняет задачи не по расписанию, а в зависимости от событий.