Batch-Jobs

一次處理一項任務

  • December 29, 2019

我習慣了具有靈活排隊配置可能性的 IBM i (AS/400) 批處理。我正在尋找類似的 Linux 批處理工具。

最重要的是一次從隊列中取出一項作業並執行。之後,將掃描隊列以查找更多條目。如果有的話,下一個任務將被取出來執行。

at -b相對接近,但如果一個作業佔用的資源太少以至於負載保持下降,更多的任務會並行執行,這是不希望的。

Run-p​​arts 將是另一種選擇,但它的行為過於靜態,並且不會作為守護程序執行以在給定隊列中查找新條目。我可以將其作為正常 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

引用自:https://unix.stackexchange.com/questions/559304