我想在我的电脑关闭时将文件上传到我的保管箱。
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
文件上传到我的保管箱中。
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解析器在我的电脑关机时解析主机?
方法一:/etc/systemd/system/upload.service
1.1 /etc/systemd/system/upload.service
1.2 vim /home/upload.sh
1.3
sudo systemctl enable upload.service
方法2:/lib/systemd/system-shutdown/upload.service
2.1 /lib/systemd/system-shutdown/upload.service
2.2 vim /home/upload.sh
2.3
sudo systemctl enable /lib/systemd/system-shutdown/upload.service
Execstop 和 Execstart 颠倒
根据这个 Unix & Linux 的回答:How to run a script with systemd right before shutdown,你的 Execstop 和 Execstart 是相反的。
这些行:
应该读:
答案继续提到重新启动服务。
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
。在系统宕机时运行程序或脚本的最佳方法是使用
ExecStop=
单元的 运行此类程序。ExecStart=
可以是一个虚拟脚本(例如) ,/bin/true
或者在最近的 systemd 版本中,它甚至可以被省略。关于依赖关系,您希望将您的单元放在您需要的服务之后,例如,
network-online.target
如果systemd-resolved.service
您将其用于 DNS 解析。原因是系统在关机时以与启动相反的顺序停止。因此,通过在依赖项之后订购您的服务,这意味着您的ExecStop=
脚本将在依赖项停止之前运行。像这样的东西应该工作:
像往常一样启用该单元(
--now
参数也启动它):它会在停止时执行上传,您可以使用以下方法进行测试:
最近在 systemd-devel 邮件列表中对此进行了讨论。