web-dev-qa-db-ja.com

1時間ごとにコードを実行する

1時間ごとに実行されるWebサービスを作成する必要があります。これは、データベース内のデータを確認し、特定の条件が満たされている/満たされていない場合に同じデータベース内のテーブルにアラートを追加するために使用されます。私たちが現在持っているものは:

Python=を使用してアマゾンウェブサービス(AWS)仮想サーバーに報告するエンドデバイスがあります。AWSサーバーはその情報を取得してMySQLデータベースに保存します。AWSサーバーはLinuxを実行しています= DjangoおよびApache。エンドデバイスによって保存されたデータを検証するコードを1時間ごとに実行する必要があるpythonコードが必要です。特定の条件が満たされない場合、データベースのalertsテーブルにレコードが追加されます。

上記の設定を作成することを最初に契約しました。 Python、Django、Apacheは初めてです。ただし、Pythonコードを変更して、エンドデバイスとの間でデータを送受信します。私はWebプログラミングに侵入するコーダーです。

誰か私がこれを行う方法について何かアドバイスはありますか?

8
Linger

あなたがシェルアクセスを持っていると仮定して、 cronjob を作るのはどうですか?

cronデーモンは、実質的にすべてのUNIXライクなシステムに存在し、crontabと呼ばれるファイルの記述に基づいて実行するコマンドをスケジュールします。

ファイルの各行には、コマンドが実行される時点を示す一連のフィールドが含まれています。

タスクは、達成したいタスクを実行するスタンドアロンプ​​ログラム、または別の回答が示唆するように、wgetのようなHTTPクライアントの呼び出しのいずれかです。 curlまたはfetchを使用して、アクションを実行するWebリソースにアクセスします。

リクエストの処理にかかる時間に制限がある場合は、タスクを、Webフレームワーク/サーバー内で実行されないオフラインのスクリプトまたはプログラムに移動する必要がある場合があります。

31
Lars Viklund

AWSでDjangoを使用して、 Celery を調べます。

Celeryは非同期タスクを追加し、スケジューラーを含みます。AWSでは、ブローカーとして Amazon Simple Queue Service を使用するようにCeleryを構成できます(スタックオーバーフローで Amazon SQSを使用したCelery を参照)。 このブログ投稿 件名について)。

Celery定期タスクスケジュール を設定すると、そのスケジュールに従って構成されたタスクが実行されます。

利点は、セットアップ全体を使用して非同期タスクを実行し、重いタスクをWebサーバーからCeleryワーカーにオフロードできることです。

軽量の代替手段は、crontabジョブを設定することです。 Djangoアプリケーションでcurlまたはwgetを使用して呼び出されるようにルートを構成することもできます。

* 5 * * * curl http://username:password@hostname/route_to_job
17
Martijn Pieters

AWSインスタンスはLinuxを実行しているため、おそらく cron job としてこれを達成できます。

あなたは私が言うことを行うことができます Drupalのcronアプローチ これは、Djangoの場合、URLに応答するコントローラーを作成し、必要なアクションを実行することを含みます。

次に、コントローラのURLをcurlにcronタスクを構成し、スクリプトをトリガーします。

これには、いつでもURLから簡単に呼び出すことができるという追加の利点があります。たぶん、せっかちなマネージャーが、過去20分のデータから生成されたレポートを必要としています。

7
msanford

APSchedulerを調べてみてください。これは、Pythonのクオーツのようなスケジューラーです(それほど広範囲ではありません)。

これは、プラットフォームに依存せず、アプリケーションの変数や関数に直接アクセスできるため、長期実行アプリケーション(ウェブアプリケーションなど)の外部で実行するcronスクリプトのはるかに優れた代替手段になる可能性があります。

最新のリリースの説明はここにあります: http://pypi.python.org/pypi/APScheduler/2.0.

インストール/実装に関するいくつかのドキュメントがここにあります: https://apscheduler.readthedocs.org/en/latest/

ここにいくつかの機能があります:

  • (ハード)外部依存関係なし
  • スレッドセーフAPI
  • 優れたテストカバレッジ(CPython 2.5-2.7、3.3、Jython 2.5.3、PyPy 1.9でテスト済み)
  • 構成可能なスケジューリングメカニズム(トリガー):
    • Cronのようなスケジューリング
    • 単一実行ジョブのスケジューリングの遅延(UNIXの「at」コマンドなど)
    • 間隔ベース(指定された時間間隔でジョブを実行)
  • 複数の、同時にアクティブなジョブストア:
    • RAM
    • ファイルベースのシンプルなデータベース(シェルフ)
    • SQLAlchemy(サポートされているすべてのRDBMSが機能します)
    • MongoDB
    • Redis
3
Anna

ほとんどの場合、ここでの答えは、デフォルト設定で crontab を実行している場合に提供されます。つまり、crontab SPOOL RATHER THE FILESが表示されます。

一方、それはAWSでも実行できます。プレインストールおよび構成されたcronが付属しているため、毎時間、毎日、毎週、または毎月だけでなく、ファイルを/etc/cron.xxxxxx説明どおりのディレクトリ here

毎時、毎日、毎週、または毎月実行するジョブの設定は非常に迅速です。質問はコードを毎時間実行する方法を尋ねているので、AWS Linuxでは/etc/cron.hourly

SSHクライアントを介してインスタンスにログインするときの手順は次のとおりです。

$ echo "/usr/bin/python -q /path/to/your/file" > application
$ Sudo mv application /etc/cron.hourly/
$ Sudo chown -R root /etc/cron.hourly
$ Sudo chmod 2755 /etc/cron.hourly/application
$ Sudo /etc/init.d/crond restart

上記の例では、「application」という名前のファイルが保存されています。名前は、一意である限り、特に重要ではありません。これは、次を実行した場合のログレポートです:$ Sudo vim /var/log/cron

Dec 28 19:01:01 ip-xxx-xx-xx-xx CROND[20243]: (root) CMD (run-parts /etc/cron.hourly)
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20261]: finished 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting application
Dec 28 19:01:02 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20323]: finished application

ログに示されているように、時間単位で実行が開始されます anacron 定期的なコマンドを実行します cron によって伝統的に行われるスケジューリング。次に、ディレクトリ内の他のすべてのファイルを呼び出し、各ファイルでコマンドを実行します。

1
Chetabahana

Django-extensionsのようなものを使用できると思います

Django-Extensionsウェブサイト

モジュールがあります-ジョブ。私にとって、これはあなたのcronジョブを制御するための非常に良いツールです。

2番目のオプションは、ファブリックを使用して、このための関数を作成することです。

そして、私は3番目の方法を見ます。あなたの想像力と知識を使って、サブプロセスとshで独自の関数を作成してください。

1
Demagog