Не мог разрешить хост: content.dropboxapi.com, когда загрузить файл на завершении работы

Я хочу загрузить файл на свой 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 разрешить хост в завершающее работу время моего ПК?

3
задан 20 April 2018 в 14:59

3 ответа

метод 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

1
ответ дан 1 December 2019 в 17:28

Лучший способ запустить программу или сценарий во время остановки системы - использовать 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.

0
ответ дан 1 December 2019 в 17:28

Execstop и Execstart инвертируются

Согласно этому ответу 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.

0
ответ дан 1 December 2019 в 17:28

Другие вопросы по тегам:

Похожие вопросы: