Batch-Jobs
一次處理一項任務
我習慣了具有靈活排隊配置可能性的 IBM i (AS/400) 批處理。我正在尋找類似的 Linux 批處理工具。
最重要的是一次從隊列中取出一項作業並執行。之後,將掃描隊列以查找更多條目。如果有的話,下一個任務將被取出來執行。
at -b
相對接近,但如果一個作業佔用的資源太少以至於負載保持下降,更多的任務會並行執行,這是不希望的。Run-parts 將是另一種選擇,但它的行為過於靜態,並且不會作為守護程序執行以在給定隊列中查找新條目。我可以將其作為正常 cron 作業執行,但我需要自己處理要從隊列中刪除的作業。
我是否必須編寫自己的程式碼或擴展 at 才能實現所需的功能,或者是否有可用的替代批處理排隊機制?
ts - task spooler. A simple unix batch system
應該完成任務。它執行一個任務後台處理程序/隊列伺服器,您可以使用一個簡單的命令添加一個新任務,例如:tsp yourcommand
您可以指定槽數 - 也就是一次應該執行多少個作業。預設情況下,這設置為一個,AFAIK。它還具有一些高級功能,例如僅在某個先前的命令成功時才執行命令。您還可以查看每個作業的隊列和詳細資訊。您可以在手冊頁中找到更多詳細資訊。
你可以使用 bash 來做到這一點:
1- 使用 mkfifo 創建 fifo(你也可以創建文件)
mkfifo mybuff
2-尾隨fifo並將每一行傳遞給您的執行程序(這將是一種任務伺服器)
while IFS= read -r line do echo "Running: '$line' with bash" bash -c "$line" echo "Finished '$line' with exit code: $?" done < <(tail -f mybuff)
3-例如將您的命令發送到隊列(這將客戶端請求任務)
echo 'sleep 10' >> mybuff echo 'echo "hello world"' >> mybuff echo 'my fancy command to be executed' >> mybuff ...
PS:您可以像下面的範例一樣簡化第 2 步,但是當您將“exit”發送到命令緩衝區時,這將完成任務偵聽器
tail -f mybuff | bash -x