
我必須啟動總共 NUMTOT 個程式(可以是任何 C、Mathematica、ns-2...數學環境)。問題是執行這些程序的電腦只允許最大執行次數,例如MAX,(MAX < NUMTOT)。
我在終端機中使用以下行運行這些程序
./run.sh -d directory num
重複地,其中 run.sh 是我呼叫數學程式的腳本; directory是我的程式所在的目錄,num表示新執行的次數(integer*num = NUM)。腳本「run.sh」使用「directory」(程式)的副本建立「num」個目錄,並啟動「num」個程式實例。就我而言,就是 Matlab 實例。
我想要一個腳本,它可以自動追蹤正在運行的進程數,以及當最大數量減少到(MAX-num)時,因為「num」已經完成,然後啟動Matlab的下一個「num」模擬,直到總數NUM次模擬已完成。
如果腳本能夠在只有一個程式剛完成時呼叫下一個程式來維護 MAX 個可能的進程,那就更好了。
實際上,要了解正在運行的進程數,我運行以下腳本
ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
這給出了此時運行的 Matlab 總數。
如何僅透過一個腳本進行整套模擬?
答案1
強制使用者執行最大進程數的常用方法是透過pam_limits(8)
.檢查limits.conf(5)
線上說明頁以取得詳細資訊和範例以進行/etc/security/limits.conf
相應的變更。
具體來說,您要配置的nproc
參數:
nproc
maximum number of processes
在線上說明頁中使用此參數的範例:
@faculty soft nproc 20
@faculty hard nproc 50
答案2
我建議不要定期檢查正在運行的實例的數量,而是建議編寫一個腳本,一次又一次地運行該程序,直到NUM
達到該數量,然後並行啟動該腳本MAX
多次。
您也可以捕獲SIGCHLD
子進程退出時發出的信號。必須先使用 啟用此功能set -o monitor
。更詳細的範例和替代方案可以在以下位置找到Stackoverflow 上的一個線程。
答案3
如果您的 MATLAB 作業是非互動式的(即執行批次腳本),那麼您可能需要研究批次調度軟體,例如扭力或者泥- 這種資源管理正是他們設計的目的。
這些通常用於 HPC 集群,但在您的情況下,您的集群只有一個計算節點。
Slurm 的優點是它是一個現代化的、設計良好的系統,利用了多年來與其他調度程式的經驗。 Torque/PBS 的優點是熟悉——許多人已經在其他叢集上使用過它。 Slurm 有一組相容性包裝器,以便習慣 PBS 或 Torque 的人們可以透過熟悉的命令立即開始使用它。
兩者都會為您提供許多控製作業調度的選項 - 透過 CPU 核心、記憶體、可用授權等。如果您需要追蹤或限制每個使用者的累積使用量,它們還提供會計服務。例如,Slurm 有一個公平使用權重選項,可用於將最近沒有運行過很多作業的人的作業優先於經常使用該系統的人 - 這通常比總的固定硬配額要好cpu時間。
繞過有限許可證的另一個選項是編寫 MATLAB 腳本,以便它們與GNU 倍頻程以及 MATLAB。然後,您可以根據需要執行任意多次測試/開發運行,並在 MATLAB 中進行最終運行(如果需要發布結果或與其他研究人員合作)。 Octave 大部分與 MATLAB 相容,但也有一些差異 - 這是概括。
答案4
一個在另一個線程中回答有關限制 bash 中子進程數量的問題顯示以下程式碼片段,它將等待 4 個作業之一完成,每十秒檢查一次。
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done
請記住,這種積極的睡眠策略相當低效、粗糙且不精確。