單台機器上多個單核作業的類似隊列行為?
我有一台 24 核的舊 Mac,我想自動執行數百/數千個單核作業。我已經製作了一個在後台執行程序的 bash 腳本,但是如果我一次設置太多,電腦就會當機(顯然 300 還可以,400 太多了……)。
理想情況下,我想做的是執行 24,然後當一個完成時,第 25 個,然後當下一個完成時,第 26 個,依此類推。不幸的是,每項工作都可能需要不同的、可變的執行時間,所以我不能做某種計時來讓它們在交錯的時間執行。
我已經看到了一些“等待”的東西,但我不確定我是否發送了 24,比如說,帶有等待命令的 976,它會給我想要的行為,還是會在第一個之後串聯執行 976 24 完成?
編輯:謝謝,這很可能是重複的,但是當我看到該問題的答案僅指向並行時,我可以繼續在這裡探索如何使用 xargs 嗎?
這樣做的原因是,有問題的 Mac 目前位於另一個大陸,我絕對需要它在接下來的幾天內工作並執行所有這些工作 - 安裝某些東西總是有可能弄亂機器,所以我不此時我不想安裝並行,而我無法實際使用它。但它在 bash 中有 xargs,所以我正在探索使用它。
到目前為止,我已經重寫了我的 bash 腳本,以滿足 xargs 和並行預期的情況,我可以使用各種輸入來執行它。所以現在,我擁有的是一個 bash 腳本,它在文件夾中的每個文件上執行我的作業。我目前嘗試過:
ls -d 我的文件夾/* | xargs -P 2 -L 1 ~/bin/myscript.sh
但這似乎仍然同時執行它們,因此我不確定我做錯了什麼。(這裡我使用最多 2 個,這樣我就可以繼續查找和測試!我只在文件夾中放了 4 個 - 不想意外發送數百個)
最後編輯:啊哈!!!很久以後我才發現我做錯了什麼。xargs 可能並行執行我的腳本,但不是我編寫腳本執行的程序。我寫了一個腳本,因為我無法弄清楚如何將文件名插入到參數列表中,這需要參數=值對。我最終想出瞭如何使用 xargs 中的 -I 標誌來做到這一點。這終於奏效了:
ls -d 我的文件夾/* | xargs -I foo -P 2 -L 1 我的程序 arg1 arg2 arg3=foo arg4
(我認為 -I 和 -L 1 是多餘的,但是當它起作用時,我並沒有弄亂它……)
在這裡, foo 在 myprogram 的參數列表中被替換為每個文件名。我注意到我花了很長時間才弄清楚的一個原因是大多數指令都使用 -I 使用 {} 作為要替換的元素,並且由於某種原因在我的 Mac 上它無法處理。所以我想 - 我沒有工作,但它與 foo 一起工作得很好。
我最近遇到了類似的問題。據我所知,您有兩種選擇:
和
例如,要將
find
命令找到的每個 flac 文件轉換為 ogg,我嘗試執行:find -name "*.flac" -print0 | xargs -0 -P 24 -L 1 oggenc
使用命令中的行
-P 24
一次執行最多程序。我相信您可以使用它來根據您的需要對其進行自定義,但我們需要您的問題提供更多詳細資訊。-L 1``find
您可以使用多種工具,但我認為最好的是 GNU 並行。它在靈活性和實用性方面比 xargs 好得多。Linked是對 MacOS 的 GNU 並行的描述。我認為您會發現這可能是您尋求的排隊的最佳解決方案。
有關使用並行的更多資訊在這裡。