Я хочу загрузить файл на свой Dropbox, когда мой ПК закрывается.
sudo vim /etc/systemd/system/upload.service
[Unit]
Description=upload files into dropbox
Before=network.target shutdown.target reboot.target
Requires=network-online.target
[Service]
ExecStop=/bin/true
ExecStart=/bin/bash /home/upload.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
И upload.sh сценарий.
cd /home
curl -X POST https://content.dropboxapi.com/2/files/upload \
--header "Authorization: Bearer xxxx" \
--header "Dropbox-API-Arg: {\"path\":\"/test.txt\",\"mode\":{\".tag\":\"overwrite\"}}" \
--header "Content-Type: application/octet-stream" \
--data-binary @"test.txt"
bash upload.sh
может выполняемый успешно, и test.txt
файл загружается в мой Dropbox.
sudo systemctl enable upload service
Перезагружать мой ПК.
sudo journalctl -u upload
Apr 13 23:58:52 localhost systemd[1]: Started upload files into dropbox.
Apr 13 23:58:52 localhost systemd[1]: Starting upload files into dropbox...
Apr 13 23:58:52 localhost bash[117]: % Total % Received % Xferd Average Speed Time Time Time Current
Apr 13 23:58:52 localhost bash[117]: Dload Upload Total Spent Left Speed
Apr 13 23:58:52 localhost bash[117]: 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (6) Could not resolve host: content.dropboxapi.com; Un
Apr 13 23:58:52 localhost systemd[1]: upload.service: main process exited, code=exited, status=6/NOTCONFIGURED
Apr 13 23:58:52 localhost systemd[1]: Unit upload.service entered failed state.
Apr 13 23:58:52 localhost systemd[1]: upload.service failed.
Некоторая ошибка DNS Could not resolve host: content.dropboxapi.com
результат в upload.service перестал работать.
Я добавил Requires=network-online.target
в upload.service, как заставить синтаксический анализатор DNS разрешить хост в завершающее работу время моего ПК?
метод 1:/etc/systemd/system/upload.service
1.1/etc/systemd/system/upload.service
sudo vim /etc/systemd/system/upload.service
[Unit]
Description=upload files into dropbox
Before=shutdown.target reboot.target
Requires=network-online.target
After=network.target
[Service]
ExecStop=/bin/true
ExecStart=/bin/bash /home/upload.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
1,2 энергии/home/upload.sh
cd /home
curl -X POST https://content.dropboxapi.com/2/files/upload \
--header "Authorization: Bearer xxxx" \
--header "Dropbox-API-Arg: {\"path\":\"/test.txt\",\"mode\":{\".tag\":\"overwrite\"}}" \
--header "Content-Type: application/octet-stream" \
--data-binary @"test.txt"
1.3 sudo systemctl включают сервис загрузки
метод 2:/lib/systemd/system-shutdown/upload.service
2.1/lib/systemd/system-shutdown/upload.service
sudo vim /lib/systemd/system-shutdown/upload.service
[Unit]
Description=upload files into dropbox
Before=shutdown.target reboot.target
Requires=network-online.target
After=network.target
[Service]
ExecStop=/bin/true
ExecStart=/bin/bash /home/upload.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
2,2 энергии/home/upload.sh
cd /home
curl -X POST https://content.dropboxapi.com/2/files/upload \
--header "Authorization: Bearer xxxx" \
--header "Dropbox-API-Arg: {\"path\":\"/test.txt\",\"mode\":{\".tag\":\"overwrite\"}}" \
--header "Content-Type: application/octet-stream" \
--data-binary @"test.txt"
2.3 sudo systemctl включают/lib/systemd/system-shutdown/upload.service
Лучший способ запустить программу или сценарий во время остановки системы - использовать ExecStop=
устройства для запуска такой программы. ExecStart=
может быть либо фиктивным скриптом (например, /bin/true
), либо, в последних версиях systemd, его даже можно опустить.
Что касается зависимостей, вы хотите разместить свой блок после необходимых вам сервисов, таких как network-online.target
и, возможно, systemd-resolved.service
, если вы используете его для разрешения DNS. Причина этого заключается в том, что системы останавливаются во время выключения в обратном порядке, в котором они запускаются. Таким образом, заказ вашего сервиса после зависимостей означает, что ваш ExecStop=
скрипт будет запущен до того, как зависимости будут остановлены.
Примерно так должно работать:
[Unit]
Description=upload files into dropbox
After=network.target systemd-resolved.service
Requires=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Включить устройство как обычно (аргумент --now
также запускает его):
$ sudo systemctl enable --now upload.service
И оно выполнит загрузку, когда остановлено , с помощью которого вы можете проверить:
$ sudo systemctl stop upload.service
Это недавно обсуждалось в списке рассылки systemd-devel.
Согласно этому ответу Unix & Linux: Как запустить скрипт с systemd правом перед завершением работы, Ваш Execstop и Execstart инвертируются.
Строки:
ExecStop=/bin/true
ExecStart=/bin/bash /home/upload.sh
Должен читать:
ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh
Ответ продолжает упоминать для перезапуска сервисов. Таким образом, после создания файла, удостоверьтесь, что systemctl daemon-reload
и systemctl enable yourservice --now
before=
, requires=
, и т.д. может время от времени сбивать с толку. Можно вставить сценарий /usr/lib/systemd/system-shutdown/
каталог вместо этого. Это будет выполнено непосредственно после завершения работы. См.: https://superuser.com/questions/1016827/how-do-i-run-a-script-before-everything-else-on-shutdown-with-systemd
/usr
префикс может отличаться в некоторых системах, т.е. только запустить имя каталога с /lib
.