如何安排依赖于网络可用性的作业?

如何安排依赖于网络可用性的作业?

我克隆了一些项目的 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

相关内容