簡體   English   中英

每10秒執行一次cron作業n次,然后停止

[英]Run cron job every 10 seconds n times then stop

我有一種特殊的情況,我需要查詢服務以在每天的特定時間獲取n位用戶的信息。 問題是,如果我一次執行所有操作,它將使服務脫機/崩潰。

因此,要克服此問題,最好每10秒左右為x個用戶運行一次,直到x = n然后停止。

我可以設置一個每天運行的cron腳本,另一個每10秒運行的cron腳本。 例如,每日腳本會將數據庫中的值設置為1(“開始查詢”)(默認值為0,表示關閉),然后第二個腳本(每10秒運行一次)檢查此數據庫值是否為1。設置為true時,它將遍歷用戶,一次查詢服務x個用戶,並遞增同一數據庫表中的另一列,以跟蹤其在列表中的位置。

該解決方案的問題(據我個人所述)是,每10秒運行一次的第二個腳本必須每次查詢DB,以查明“開始查詢”設置是否設置為1。這可能會占用大量處理器資源。 有誰有更好的解決方案?

注意:代碼是用PHP編寫的-由於服務器上php腳本的最大執行時間,因此無法使用睡眠

我同樣可以在python中執行此操作,是否有針對cgi腳本的最大執行限制?

為什么不僅要有一個每天運行的cron腳本,而且每隔十秒才調用另一個腳本,直到另一個腳本表明已完成(例如,返回一個表示“無需處理的值”)?

或者一個每天運行的腳本,它只是循環地遍歷用戶塊,對每個X用戶執行sleep()...

請記住,使用CLI的PHP版本時,您不受執行時間限制的限制,並且可以使用標准錯誤和輸出流等與cron和其他shell腳本進行很好的交互。

例如,對於第一種方法,您甚至不必將PHP用於“控制”腳本-一個非常簡單的shell腳本,該腳本只是循環,調用PHP腳本然后休眠,然后檢查“成功”返回值(由PHP腳本的exit ()函數返回)就可以了。

您可以將“ at”與“ cron”結合使用。 設置一個每天執行一次任務的cron作業,該任務就是(我現在沒有UNIX機器,所以可能有奇怪的語法錯誤)。

0 9 * * * at now + 10 secs /path/to/shellscript 1

參數是運行計數。 當shellscript運行時,它會重新計划運行時間,從而增加運行次數,因此您可以:

#!/bin/ksh

integer i
let i=1+$1
if [[ $i -lt 11 ]]
then
    at now + 10 secs /path/to/shellscript $i

    # do everything else the script needs to do
fi

注意:此解決方案還假定“ at”可以下降到每秒(不確定是否可行;可能取決於實現方式)。 如果不是這樣,那么解決方案從一開始就可能無效:-)在這種情況下,最好讓一個腳本執行填充和睡眠操作(根據Matt Gibson的回答)。

多種方法可以做到這一點:

  • 擁有一個腳本,該腳本可以運行一部分工作,並將所有數據放入一個變量中,以便對數據和狀態進行序列化。 我已經為代碼點火器實現了一個調度程序控制器,以便在http://www.younelan.com/index.php?&repository=DCExplorer時獲取一條地鐵路線。 它可能比您要查找的要復雜,但可能會讓您了解如何以不同的間隔運行多個任務,並將其分解為較小的部分
  • 通過cron或手動從命令行運行腳本-沒有超時的痛苦

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM