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?
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
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.
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
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
.