web-dev-qa-db-fra.com

Impossible de résoudre l'hôte: content.dropboxapi.com lors du téléchargement du fichier à l'arrêt

Je souhaite télécharger un fichier dans ma liste déroulante lorsque mon ordinateur est en cours de fermeture.

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

Et le script 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 peut être exécuté avec succès, et test.txt fichier chargé dans ma liste déroulante.

Sudo systemctl enable upload service  

Pour redémarrer mon pc.

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.

Certaines erreurs DNS Could not resolve Host: content.dropboxapi.com entraînent l’échec de upload.service.

J'ai ajouté Requires=network-online.target dans upload.service, comment obliger l'analyseur DNS à résoudre l'hôte au moment de la fermeture de mon ordinateur?

3
it_is_a_literature

méthode 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 vim /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 activer le service de téléchargement

méthode 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 vim /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 enable /lib/systemd/system-shutdown/upload.service

1
scrapy

Le meilleur moyen d'exécuter un programme ou un script lorsque le système est en panne est d'utiliser le ExecStop= de l'unité pour exécuter ce programme. Le ExecStart= peut être un script factice (tel que /bin/true) ou, dans les versions récentes de systemd, il peut même être omis.

En ce qui concerne les dépendances, vous souhaitez placer votre unité après les services dont vous avez besoin, tels que network-online.target et peut-être systemd-resolved.service si vous ' utilisez-le pour la résolution DNS. La raison en est que les systèmes sont arrêtés au moment de l’arrêt dans l’ordre inverse de leur démarrage. Donc, en commandant votre service après les dépendances, cela signifie que votre script ExecStop= sera exécuté avant les dépendances sont arrêtées.

Quelque chose comme ça devrait marcher:

[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

Activez l'unité comme d'habitude (l'argument --now le lance également):

$ Sudo systemctl enable --now upload.service

Et il effectuera le téléchargement lorsque s’arrêtera , que vous pourrez tester avec:

$ Sudo systemctl stop upload.service

C'était récemment discuté dans la liste de diffusion systemd-devel.

0
filbranden

Execstop et Execstart inversés

Selon cette réponse Unix et Linux: Comment exécuter un script avec systemd juste avant l’arrêt , vos Execstop et Execstart sont inversés.

Les lignes:

ExecStop=/bin/true
ExecStart=/bin/bash  /home/upload.sh

Devrais lire:

ExecStart=/bin/true
ExecStop=/bin/bash  /home/upload.sh

La réponse continue pour mentionner de redémarrer les services. Donc, après avoir créé le fichier, assurez-vous de bien utiliser systemctl daemon-reload et systemctl enable yourservice --now


Méthode alternative ne fonctionne pas

Le before=, requires=, etc. peut parfois être déroutant. Vous pouvez également placer votre script dans le répertoire /usr/lib/systemd/system-shutdown/. Il sera exécuté immédiatement après l'arrêt. Voir: https://superuser.com/questions/1016827/how-do-i-run-a-script-before-everything-else-on-shutdown-with-systemd

Le préfixe /usr peut être différent sur certains systèmes, c'est-à-dire qu'il suffit de démarrer le nom du répertoire avec /lib.

0
WinEunuuchs2Unix