如果可能的话,我想用它systemd
来完成这个任务。这就是我到目前为止所做的。
- 编写了一个脚本,用于
fish
暂存、提交文件并将其推送到存储库。脚本可通过chmod u+x <script>.fish
. - 写了一个服务单元。
- 重新加载
systemctl --user daemon-reload
,启用systemctl --user enable backup.service
。
这是鱼脚本。
#!/usr/bin/fish
set note_dir /home/yjh/Documents/notes
cd $note_dir
set today (date "+(%A) %B-%d-%G %T")
git add .
git commit -am $today
git push origin master
这是服务单元文件。
[Unit]
Description=Backup obsidian notes before shutdown
DefaultDependencies=no
After=network-online.target
Wants=network-online.target
Before=halt.target reboot.target shutdown.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=fish /home/yjh/scripts/backup.fish
[Install]
WantedBy=halt.target reboot.target shutdown.target
这是我应用链接后的服务单元文件回答由弗雷迪提供。该答案链接到另一个答案我也应用了这些更改,但它仍然不起作用。
我已经以两种方式手动运行该脚本,./<script>fish
并通过像这样的 systemctl 启动它systemctl --user start backup.service
,它们都能够将我的代码推送到 github。我已经为该特定存储库设置了 SSH,因此,当我想要推送到 github 时,不会询问密码或用户名。
答案1
TL;DR,尝试这个简化版本:
[Unit]
Description=Backup obsidian notes before shutdown
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=fish /home/yjh/scripts/backup.fish
[Install]
WantedBy=default.target
将其作为用户服务运行,我的测试脚本没有自动启动(不活跃(死亡)代替活动(退出))。起初我WantedBy=multi-user.target
在安装部分使用。但该目标不可用于运行用户服务,与halt.target
或相同reboot.target
。切换它会WantedBy=default.target
产生差异,请参阅Systemd 服务未启动(WantedBy=multi-user.target)。
删除DefaultDependencies=no
会添加隐式依赖项Conflicts=shutdown.target
和Before=shutdown.target
,请参阅systemd.目标和systemd.special#shutdown.target。
编辑服务以更改符号链接后重新启用该服务:
systemctl --user reenable backup.service
然后重新启动并再次关机,看看是否有效。