![如何安排依赖于网络可用性的作业?](https://linux22.com/image/25793/%E5%A6%82%E4%BD%95%E5%AE%89%E6%8E%92%E4%BE%9D%E8%B5%96%E4%BA%8E%E7%BD%91%E7%BB%9C%E5%8F%AF%E7%94%A8%E6%80%A7%E7%9A%84%E4%BD%9C%E4%B8%9A%EF%BC%9F.png)
我克隆了一些项目的 Git 存储库。我想git pull
每周自动化并编译一次该项目。我使用的笔记本电脑不是 24x7 的。现在,我无法使用,cron
因为我应该保持系统在那一刻运行。我无法使用anacron
其中任何一个,因为它可能会在我连接到网络之前启动。是否有一些选项anacron
仅当我连接到互联网时才运行此特定作业?或者我应该为此使用其他不同的工具?
答案1
使用anacron
,因为您不会 24/7 都在线,然后添加一些魔法来确保网络正常运行(通过 ping 默认网关),如果没有延迟执行。
这是一个可以让您接近的示例脚本:
#!/bin/bash
cd repo
JOB="git pull"
ping -c 2 $(netstat -rn | awk '/^0.0.0.0/ {print $2}') 2>&1 > /dev/null && $JOB || echo $JOB | at $(date --date="+1 hour" +%H:%M)
答案2
连接到网络时运行作业。大多数发行版都有一个可以插入的脚本基础架构,但您需要 root 权限。如果您使用 NetworkManager 或 Wicd 连接,它们也有自己的钩子基础设施。添加一个仅在网络可用时运行的 cron 作业(并且可选地,仅在长时间未运行作业时运行),以防网络长时间保持连接。
您没有指定您的发行版,因此我将给出一个基于 Debian 的发行版的示例。中的脚本/etc/network/if-up.d
在界面调出后执行;看到interfaces(5)
手册页以获取更多信息。编写/etc/network/if-up.d/zzzz_balki_git_pull
如下脚本:
#!/bin/sh
su balki -c /home/balki/bin/pull_repository_if_old
执行pull_repository_if_old
类似以下操作(git pull
如果网络可用,则运行,除非时间戳小于 7 天):
#!/bin/sh
set -e
if [ -z "$(find /path/to/.repository.pull.timestamp -mtime -7)" ] &&
ping -c 1 -w 1 repository.example.com >/dev/null 2>/dev/null
then
cd /path/to/repository
git pull
touch /path/to/.repository.pull.timestamp
fi
EOF
您帐户上的 crontab 条目:
28 4 * * * /home/balki/bin/pull_repository_if_old