0

非常に大きなサイトで毎晩 PHP スクレーパーを実行しています。Crontab はスクリプトを午前 2 時に起動し、午前 7 時に pkill します。スクリプトを残酷に強制終了すると、データが失われる可能性があるのではないかと心配しています。スクリプトがスクレイピングされたデータをデータベースに書き込むのに忙しい間、crontab がスクリプトをオフにしたとします。翌日、データベースはその最後/最初のレコードが既に存在するため (完全ではないにしても) 拒否します。

crontab でスクリプトをフリーズする方法はありますか? (つまり、スクリプトに sleep() を追加せずに)

4

2 に答える 2

0

中断できない大きな cronjob が 1 つあるということは、通常、さまざまな理由から設計が不適切であることを示しています。

最も注目すべきは、何の理由もなく実行を中断することはできません。そうしないと、データが破損してしまうことになります。これは、予期しない停電サーバーのクラッシュが発生した場合に大きな問題になる可能性があります。

また、スケーリングしません。より多くのデータを処理する必要がある場合、それを複数のサーバーにスケーリングすることはできません。現在数時間の実行時間がある場合、すぐに完全なサーバーを使い果たす可能性があります.

この cronjob の機能を真剣に再考し、再構築して、どこかにキューに入れられた小さなタスクがいくつかあるようにすることをお勧めします。(データベースの場合もあります。)その後、単一のタスクを処理するときに信号信号をマスクし、SIGINTSIGTERMタスク間で受信した信号を確認できます。これにより、前述のいずれかを使用してプロセスに通知し、正常にシャットダウンすることができます。

そうは言っても、物事は壊れ、サーバーはクラッシュします。また、何かの作業中に cronjob が故障した場合に備えて、データ復旧の計画を立てることを強くお勧めします。

于 2013-05-16T08:29:17.643 に答える
0

スクリプトがスクレイピングされたデータをデータベースに書き込むのに忙しい間、crontab がスクリプトをオフにするとします。

プロセスを外部で停止すると、トランザクションのタイムアウトなどが発生するため、これは問題になります。より良い方法は、スクリプトを自動的に停止/一時停止させることです。たとえば、スクリプトによって定期的にチェックされるマーカー ファイルを定義して、スクリプトが制御された方法で停止/一時停止できるようにすることができます。

于 2013-05-16T07:39:37.473 に答える