ネットワークの可用性に基づいてタスクをスケジュールする方法は?

ネットワークの可用性に基づいてタスクをスケジュールする方法は?

一部のプロジェクトのGitリポジトリを複製しました。私はgit pullこのプロジェクトを週に一度自動化してコンパイルしたいと思います。私が使っているノートパソコンは24x7ではありません。現時点ではcron、システムを実行し続ける必要があるため、使用できません。anacronネットワークに接続する前に起動できるため、それらのどれも使用できません。anacronインターネットに接続している場合にのみこの特定のタスクを実行するオプションはありますか?それともこれには別のツールを使用する必要がありますか?

答え1

anacron年中無休の24時間オンラインではないため、これを使用して遅延がない場合は、ネットワークが動作して実行されていることを確認するためにいくつかの魔法を追加してください(デフォルトゲートウェイを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を使用して接続する場合は、独自のフックインフラストラクチャもあります。ネットワークが長時間接続されている場合に備えて、ネットワークが利用可能な場合にのみ実行されるクローンジョブを追加します(オプションで、ジョブが長期間実行されていない場合のみ)。

ディストリビューションを指定していないので、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

関連情報