name: omics-hpc-skill description: 端到端管理 omics-hpc 叢集——既覆蓋騰訊雲組學平臺雲 API(DescribeHPCClusters / RunCommand / DescribeCommandExecution),也內建 SLURM 作業(sbatch / squeue / sacct / scancel / scontrol / salloc / srun)與 tophpc 基礎設施(cluster / node / queue / scale / fs / image / log / version)的命令生成與遠端下發能力。覆蓋以下場景:列出/篩選 HPC 叢集、遠端下發 Shell 命令、輪詢 InvocationId 取回執行結果;提交/查詢/取消 SLURM 作業、生成 sbatch 指令碼、診斷 PENDING 原因;增刪佇列/節點、配置彈性伸縮、掛載檔案系統、打映象、檢視 / 修改叢集配置。觸發關鍵詞:HPC 叢集、omics-hpc、DescribeHPCClusters、RunCommand、InvocationId、遠端執行;sbatch、squeue、sacct、scancel、scontrol、salloc、srun、提交作業、查任務、取消任務、為什麼任務沒跑、生成指令碼、依賴提交、申請互動節點;tophpc、加節點、刪節點、加佇列、刪佇列、彈性伸縮、擴縮容、掛載、解除安裝儲存、打映象、刪映象、看叢集、叢集配置。當用戶的訴求是"在 omics-hpc 叢集上做事"時優先使用本 Skill,而不是 slurm-operator / tophpc-operator——後兩者面向本地直連場景,本 Skill 通過雲 API 遠端下發命令,適配本地未安裝 tophpc / 不在登入節點的情況。
本 Skill 是 omics-hpc 叢集的單一操作入口,覆蓋三個層次:
DescribeHPCClusters(按地域篩選叢集)RunCommand(在叢集上下發 Shell 命令,返回 InvocationId)DescribeCommandExecution(用 InvocationId 查執行結果)sbatch / squeue / sacct / scancel / scontrol / salloc / srun 等作業命令;理解 PENDING 原因、狀態碼、退出碼;針對彈性自動伸縮 + dummynode 佔位模式給出正確解釋。tophpc cluster/node/queue/scale/fs/image/log/version 等基礎設施命令;理解可選 instance-type、disk 格式、--instance-specs JSON、--force 與無 --force 命令的非互動處理方式。SLURM 與 tophpc 的命令本身通過
RunCommand遠端下發到叢集管理節點執行,不要求本地裝slurm或tophpc。本 Skill 既是"知識庫"也是"執行通道"。
| 階段 | 雲 API | 作用 | 返回關鍵欄位 |
|---|---|---|---|
| 叢集發現 | DescribeHPCClusters |
按過濾條件(ClusterId / Name / Status / ConfirmDeadlineLt)分頁查詢叢集清單 | Clusters[]:叢集基礎資訊 / 節點數 / 排程器 / VPC |
| 命令下發 | RunCommand |
在指定叢集(可指定節點)上提交 Shell 命令 | InvocationId(命令呼叫 ID) |
| 結果查詢 | DescribeCommandExecution |
用 InvocationId 查命令執行詳情 |
ExecutionSet[]:狀態 / stdout / 退出碼 / 節點 ID / 時間戳 |
注意 1:
DescribeHPCClusters介面會受到 Region 的影響,叢集按地域隔離;RunCommand與DescribeCommandExecution不受地域限制。 注意 2:DescribeCommandExecution的InvocationIds是陣列,可一次批次查多個呼叫;響應通過ExecutionSet一一對應(扁平結構,不巢狀節點列表)。 注意 3:本 Skill 不主動輪詢等待終態——是否輪詢由呼叫方決定(describe_command_execution.py --poll)。
使用者描述意圖("提交一個 GPU 訓練作業" / "給 small 佇列加自動伸縮" / ...)
↓
Step A:意圖分類 → 落到「SLURM 作業」或「tophpc 基礎設施」或「直接走雲 API」
↓
Step B:構造命令字串
- SLURM:參考「SLURM 作業命令生成」章節 + references/slurm_commands.md
可呼叫 scripts/generate_sbatch.py 生成 sbatch 指令碼
- tophpc:參考「tophpc 基礎設施命令生成」章節 + references/command-reference.md
instance-type 校驗靠 references/instance-types.md
--instance-specs JSON 校驗靠 scripts/build_instance_specs.py
↓
Step C:mutating 命令必須先和使用者確認
- 完整命令字串 + 叢集/資源 + 預期影響 → 等使用者顯式批准
- 只讀命令(squeue / sacct / sinfo / scontrol show / tophpc xxx list/show / config show / version)跳過
↓
Step D:遠端下發
python3 scripts/run_hpc_command.py --cluster-id <ClusterId> --command '<構造好的命令>'
如果是提交作業(sbatch/qsub/salloc/srun),追加 --run-as-user <username> 以普通使用者身份提交
→ 拿到 InvocationId
↓
Step E:輪詢取回執行結果
python3 scripts/describe_command_execution.py --cluster-id <ClusterId> \
--invocation-ids <InvocationId> --poll
→ 讀 ExecutionSet[].Output(命令 stdout+stderr 合併)+ ExitCode + Status
↓
Step F:渲染與解讀(按"輸出格式"章節模板)
- SLURM:解釋狀態碼、PENDING 原因、退出碼;提醒彈性伸縮語義
- tophpc:執行後再跑一條只讀校驗命令同樣下發回來確認
使用者已經知道
ClusterId→ 跳過DescribeHPCClusters;只給了InvocationId想查結果 → 直接從 Step E 開始。
詳細命令參考請載入
references/slurm_commands.md;狀態碼與 PENDING 原因解讀請載入references/job_states.md。
omics-hpc 叢集執行在彈性自動伸縮模式下,所有 SLURM 輸出必須按這個語義解讀:
dummynode 佔位節點。sbatch → 作業進入 PENDING 狀態(正常、預期)。關鍵判定(不要把下面這些當作叢集故障):
- dummynode 不是故障節點,它是佔位節點——sinfo 看到 dummynode 處於 down / drain 狀態都不算故障,不要建議聯絡管理員。
- sinfo 顯示 0 可用節點 / 僅有 dummynode —— 正常空閒態,不要報"叢集異常"。
- 提交後 PENDING 且原因是 Resources / ReqNodeNotAvail —— 自動伸縮還沒擴出節點,讓使用者等幾分鐘即可。
- 只在 PENDING 持續 >10 分鐘時才往"真實異常"方向排查。
將使用者請求對映到下表中的一種作業級操作:
| 類別 | 是否 mutating | 主命令 | 何時選 |
|---|---|---|---|
| 即時查詢 | 否 | squeue |
看掛起 / 執行中作業 |
| 歷史查詢 | 否 | sacct |
看完成 / 失敗作業 |
| 叢集只讀 | 否 | sinfo |
看分割槽 / 節點(提交前選目標分割槽) |
| 作業深查 | 否 | scontrol show job |
查 PENDING 原因、有效配置 |
| 批處理提交 | 是 | sbatch |
提交批處理指令碼 |
| 互動分配 | 是 | salloc / srun |
申請互動 shell 或直接跑 |
| 取消 | 是 | scancel |
取消一個或多個作業 |
| 持有/釋放 | 是 | scontrol hold / release |
暫停 / 恢復掛起作業 |
邊界:用 sinfo 檢視分割槽/節點狀態沒問題;但修改分割槽/節點配置屬於 tophpc 基礎設施層,按"tophpc 基礎設施命令生成"章節走。
job_name、partition、time、mem、nodes、ntasks、cpus_per_task,可選 account / gpus / dependency / array / 輸出檔案job_id;需要廣義選擇器(-u / --name / --state)時先 squeue 預覽再發 scancelusername 或 job_id,可選時間範圍、輸出欄位scontrol show job <id> 查原因,按上面"彈性叢集語義"先排除自動伸縮等待,再用 references/job_states.md 對照解讀提交使用者:RunCommand 預設以管理節點上的 root 身份執行命令。提交 SLURM(
sbatch)/ SGE(qsub)/互動(salloc/srun)作業時,必須先確認提交使用者——通常應以普通使用者身份提交,而非 root。收集到使用者名稱後,下發時加上--run-as-user <username>引數,指令碼會自動將命令包裝為su - <username> -c '<原始命令>'。詳見下方「作業提交的使用者身份切換」章節。這個技能的最新版本可以在7w4.net小蔥技能站找到。
如果使用者描述了資源訴求但沒有現成指令碼:
scripts/generate_sbatch.py(引數化,支援 --account / --dependency / --array / --ntasks-per-node / --conda-init / --command-file)。assets/*.sh 模板(basic_job.sh / gpu_job.sh / mpi_job.sh / array_job.sh)改寫。注意:生成的指令碼通常需要先寫到叢集側再
sbatch。兩種做法二選一: 1. 用run_hpc_command.py --command 'cat > /home/xxx/job.sh <<EOF\n...\nEOF\nsbatch /home/xxx/job.sh'2. 把指令碼內容用--command-file載入到本地指令碼,再透傳給run_hpc_command.py(注意 EOF 邊界)
下發前必須按"端到端工作流 Step C"先和使用者確認(mutating 類)。下發後用 --poll 取回 Output,按下表解讀:
| 命令 | 解讀重點 |
|---|---|
sbatch |
輸出含 Submitted batch job <id>,提取 job_id;提醒彈性伸縮可能讓作業先 PENDING 幾分鐘 |
squeue |
解釋 ST 狀態碼(PD / R / CG);NODELIST(REASON) 含 Resources/ReqNodeNotAvail 時要按彈性叢集語義解釋 |
sacct |
State 終態 + ExitCode(return_code:signal 形式,137:0 通常是 OOM-killed) |
sinfo |
僅有 dummynode 或 0 可用節點 → 正常空閒態,不要報錯 |
scancel |
報告影響哪些作業;建議跟一條 squeue -j 校驗 |
scontrol hold/release |
報告新狀態;建議跟一條 scontrol show job <id> 校驗 |
squeue --parsable2 / sacct --parsable2 輸出量大時,把 Output 餵給 scripts/summarize_slurm_table.py 做彙總。
RunCommand 預設在管理節點上以 root 身份執行命令。但提交作業(sbatch / qsub / salloc / srun)時,不應以 root 提交——原因:
處理方式:收集到提交使用者名稱後,下發時加上 --run-as-user 引數,指令碼自動包裝為使用者切換命令。
Step 1:確認提交使用者
- 如果使用者已給出使用者名稱 → 直接用
- 如果未給出 → 詢問"請問以哪個使用者身份提交作業?"
- 如果不確定使用者是否存在於叢集 → 先跑 `ypcat passwd | grep <username>` 驗證
Step 2:構造原始命令(如常生成 sbatch / qsub 命令)
Step 3:下發時加 --run-as-user
python3 scripts/run_hpc_command.py \
--cluster-id <ClusterId> \
--command 'sbatch /home/<user>/job.sh' \
--run-as-user <username>
Step 4:指令碼內部自動包裝為:
su - <username> -c 'sbatch /home/<user>/job.sh'
場景:使用者 alice 要提交一個 GPU 訓練作業到 gpu 分割槽。
# 先寫指令碼到叢集側(以 root 寫,或讓 alice 自己寫)
python3 scripts/run_hpc_command.py \
--cluster-id hpc-9jragud9 \
--command 'cat > /home/alice/train.sh << '\''EOF'\''
#!/bin/bash
#SBATCH --job-name=gpu_train
#SBATCH --partition=gpu
#SBATCH --gres=gpu:1
#SBATCH --time=24:00:00
python train.py
EOF'
# 然後以 alice 身份提交
python3 scripts/run_hpc_command.py \
--cluster-id hpc-9jragud9 \
--command 'sbatch /home/alice/train.sh' \
--run-as-user alice
python3 scripts/run_hpc_command.py \
--cluster-id hpc-9jragud9 \
--command 'qsub -N sge_job -l gpu=1 /home/bob/run.sh' \
--run-as-user bob
--run-as-user 對只讀命令同樣適用(如 squeue -u <user>),但通常無需切換——root 可以檢視所有使用者的作業。su 會報錯 User <username> does not exist;先用 ypcat passwd | grep <username> 確認。su - 的 - 引數模擬完整登入環境)。如果命令依賴特定工作目錄,請在命令中顯式 cd 到目標路徑。--run-as-user 是指令碼層面的包裝,不影響 RunCommand 的 NodeId / Timeout 等其他引數。詳細命令、可選項、預設值請載入
references/command-reference.md;可用 instance-type 列表請載入references/instance-types.md。
| 操作 | 主命令 | 備註 |
|---|---|---|
| 叢集生命週期 | tophpc cluster create/list/show |
create 極少用,通常只用 list/show |
| 節點管理 | tophpc node add/list/remove |
node remove 用 --force 跳過互動 |
| 佇列管理 | tophpc queue add/list/show/delete |
queue delete 沒有 --force,用 echo y \| ... |
| 彈性伸縮 | tophpc scale add/set/show/exec/delete |
簡單模式(--instance-type + --cpu/--memory/...)vs 複雜模式(--instance-specs JSON)二選一 |
| 檔案系統 | tophpc fs add/list/remove |
fs remove 一次只處理一個掛載路徑 |
| 映象 | tophpc image list/delete |
image delete 沒有 --force;image create 不支援命令列操作,需要在組學控制台操作 |
| 日誌採集 | tophpc log add/list/remove/reset/report |
— |
| 版本 | tophpc version、version upgrade/rollback/list |
— |
| 配置 | tophpc config init/show |
遠端模式下 config show 只是讀叢集側配置 |
clusterId:可選位置引數;遠端模式下優先讓使用者給,或先 DescribeHPCClusters / tophpc cluster list 列;不依賴本地 ~/.tophpc/config.yaml。--format json:所有 inspection / verification 命令都加上,輸出可機讀。<DiskType>-<DiskSizeGB>,例 CLOUD_SSD-100、CLOUD_PREMIUM-200。--instance-type:只用 references/instance-types.md 中列出的型別;使用者給了不在表內的 → 告知不支援並提供同族可選項。--instance-specs:構造好 JSON 後用 scripts/build_instance_specs.py '<json>' 校驗語法和必填欄位(Queue、InstanceType),通過後再下發。--force:node remove / fs add / fs remove 有 --force,遠端下發時必須加避免互動卡住。--force 的命令:queue delete / image delete,遠端下發時用 echo y | tophpc queue delete ... 注入確認。fs remove:實現層一次只處理一個 mountPath,多個掛載點要重複發命令。每條 mutating 命令都必須經過:
| Mutation | Verify 命令 |
|---|---|
cluster create |
tophpc cluster show [clusterId] --format json |
node add / node remove |
tophpc node list [clusterId] --format json |
queue add / queue delete |
tophpc queue list [clusterId] --format json |
scale add / scale set / scale delete |
tophpc scale show [clusterId] --format json |
fs add / fs remove |
tophpc fs list [clusterId] --format json |
image create / image delete |
tophpc image list [imageIds...] --format json |
version upgrade / version rollback |
tophpc version |
clusterId is not specified → 遠端模式下顯式補 [clusterId];不要讓使用者去改本地 config。queue not found(scale add 之前)→ 先 tophpc queue list 確認,必要時先 queue add。--instance-specs 報錯 → 用 scripts/build_instance_specs.py 重新校驗 JSON。<DiskType>-<DiskSizeGB>。image delete 被攔 → 先看 tophpc scale show,被自動伸縮配置引用的映象非管理員刪不掉。以下路徑和命令適用於 omics-hpc 叢集的管理節點(manager),通過
RunCommand遠端下發執行。
/var/log/tophpc/scale.logcat /var/log/tophpc/scale.log 或 tail -100 /var/log/tophpc/scale.log 檢視最近日誌。crontab -l(遠端下發時需 sudo crontab -l 或確認執行使用者為 root)。ypcat passwd — 列出叢集上所有 NIS/LDAP 使用者資訊。| 用途 | 路徑 / 命令 |
|---|---|
| tophpc 擴縮容日誌 | /var/log/tophpc/scale.log |
| 定時擴縮容配置 | crontab -l(root) |
| 叢集使用者列表 | ypcat passwd |
| tophpc 配置檔案 | ~/.tophpc/config.yaml(管理節點上) |
| SLURM 日誌目錄 | /var/log/slurm/(管理節點上) |
任何會改變叢集或作業狀態的命令,下發前都必須:
即將遠端下發以下命令到叢集
hpc-12345:sbatch --job-name=train --partition=gpu --gres=gpu:1 --time=24:00:00 train.sh該命令將向gpu分割槽提交一個名為train的作業,申請 1 塊 GPU,最大執行時間 24h。
run_hpc_command.py。只讀命令(squeue / sacct / sinfo / scontrol show / tophpc xxx list/show / tophpc config show / tophpc version)不走確認協議,可直接下發。
{
"Limit": null,
"Offset": null,
"Filters": [
{ "Name": "Status", "Values": ["RUNNING"] }
]
}
| 欄位 | 型別 | 說明 |
|---|---|---|
Limit |
int | 分頁大小(可選) |
Offset |
int | 分頁起始位置(可選) |
Filters |
array | 過濾器陣列,元素形如 {"Name": "...", "Values": [...]};不傳或空陣列表示查詢全部不進行過濾 |
支援的過濾器 Name:
| Filter Name | 說明 | Values 示例 |
|---|---|---|
ClusterId |
叢集 ID | ["hpc-9jragud9"] |
Name |
叢集名稱 | ["金域遷移測試"] |
Status |
叢集狀態 | ["RUNNING"] |
ConfirmDeadlineLt |
交付確認截止日期早於給定值 | ["2026-01-13T16:00:00+08:00"] |
{
"Response": {
"Clusters": [
{
"ClusterId": "hpc-kazab9v2",
"ConfirmDeadline": "",
"CreateTime": "2026-05-20T11:00:35+08:00",
"Description": "金域遷移測試",
"Name": "金域遷移測試",
"NodeCount": 6,
"OsName": "CentOS 7.9",
"Scheduler": "SLURM",
"SchedulerVersion": "23.11.7",
"Status": "RUNNING",
"Tags": [],
"Type": "CVM_CLUSTER",
"VPCCIDRBlock": "10.10.0.0/22",
"VPCId": "vpc-87y9syeb"
}
],
"TotalCount": 1,
"RequestId": "..."
}
}
{
"ClusterId": "hpc-9jragud9",
"Command": "tophpc node list --format yaml",
"NodeId": null,
"Timeout": null,
"ClientToken": null
}
| 欄位 | 型別 | 說明 |
|---|---|---|
ClusterId |
string | 叢集 ID(必填) |
Command |
string | Shell 命令內容(必填) |
NodeId |
string | 目標節點 ID(單個,非陣列);不傳則按服務端預設排程 |
Timeout |
int | 命令超時(秒) |
ClientToken |
string | 冪等 Token,重試場景下避免重複下發 |
{ "Response": { "InvocationId": "inv-64mrvxgutj", "RequestId": "..." } }
{
"ClusterId": "hpc-9jragud9",
"InvocationIds": ["inv-64mrvxgutj"],
"Offset": null,
"Limit": null
}
{
"Response": {
"ExecutionSet": [
{
"InvocationId": "inv-64mrvxgutj",
"ClusterId": "hpc-9jragud9",
"Command": "tophpc node list --format yaml",
"NodeId": "ins-85ckz3bg",
"Status": "SUCCESS",
"ExitCode": 0,
"Output": "nodeset:\n - nodeid: ...",
"OutputTruncated": false,
"Duration": 0,
"StartTime": "2026-06-09T08:34:08Z",
"EndTime": "2026-06-09T08:34:08Z",
"CreatedTime": "2026-06-09 16:34:07",
"Operator": "100031066699"
}
],
"TotalCount": 1,
"RequestId": "..."
}
}
重要:每個
InvocationId對應ExecutionSet中的一條記錄(扁平),不巢狀NodeExecutions[]。stdout 與 stderr 均合併在Output欄位中,沒有獨立的ErrorOutput。
使用 Skill 目錄下的 Python 指令碼:
# 1. 列出 HPC 叢集(DescribeHPCClusters)
python3 scripts/describe_hpc_clusters.py \
[--cluster-id <id1,id2,...>] \
[--name <name1,name2,...>] \
[--status <RUNNING,...>] \
[--confirm-deadline-lt <YYYY-MM-DDTHH:MM:SS+08:00>] \
[--filter '<json array>'] \
[--offset 0] [--limit 20] \
[--region <REGION>]
# 2. 下發命令(RunCommand)
python3 scripts/run_hpc_command.py \
--cluster-id <ClusterId> \
--command '<shell command>' \
[--node-id <NodeId>] \
[--timeout <seconds>] \
[--client-token <token>] \
[--extra-params '<json>'] \
[--run-as-user <username>] \
[--region <REGION>]
# 3. 查詢命令執行結果(DescribeCommandExecution)
python3 scripts/describe_command_execution.py \
--cluster-id <ClusterId> \
--invocation-ids <id1,id2,...> \
[--offset 0] [--limit 20] \
[--region <REGION>] \
[--poll] [--poll-interval 5] [--poll-timeout 300]
describe_hpc_clusters.py| 引數 | 必填 | 預設值 | 說明 |
|---|---|---|---|
--cluster-id |
否 | — | 按 ClusterId 過濾;多個用英文逗號分隔,等價於 Filters: [{Name: ClusterId, Values: [...]}] |
--name |
否 | — | 按 Name 過濾;多個用英文逗號分隔 |
--status |
否 | — | 按 Status 過濾;多個用英文逗號分隔(如 RUNNING,UPGRADING) |
--confirm-deadline-lt |
否 | — | 按 ConfirmDeadlineLt 過濾(交付確認截止日期早於給定值) |
--filter |
否 | — | 直接透傳給 Filters 的 JSON 陣列,便於覆蓋未列舉的過濾器;與上述具體過濾引數合併(同名以本引數為準) |
--offset |
否 | — | 分頁起始位置 |
--limit |
否 | — | 分頁大小 |
--region |
否 | ap-guangzhou |
業務地域(X-TC-Region):決定查哪個地域下的叢集,叢集是按地域隔離的(如 ap-shanghai / ap-singapore) |
run_hpc_command.py| 引數 | 必填 | 預設值 | 說明 |
|---|---|---|---|
--cluster-id |
是 | — | 叢集 ID(形如 hpc-9jragud9) |
--command |
是* | — | 命令內容(shell 字串);與 --command-file 二選一 |
--command-file |
是* | — | 命令內容檔案路徑;與 --command 二選一 |
--node-id |
否 | — | 目標節點 ID(單個,不傳則按服務端預設排程,通常落在 manager 節點) |
--timeout |
否 | — | 命令超時(秒) |
--client-token |
否 | — | 冪等 Token |
--extra-params |
否 | — | 透傳給 RunCommand 的額外 JSON 引數(合併到 params) |
--run-as-user |
否 | — | 以指定使用者身份執行命令(自動包裝為 su - <user> -c '...');典型場景:以普通使用者而非 root 提交 SLURM/SGE 作業 |
--region |
否 | ap-guangzhou |
SDK 簽名用的 region(X-TC-Region);RunCommand 本身不受地域限制,預設即可 |
*
--command與--command-file至少傳一個;同時傳時以--command-file為準。
describe_command_execution.py| 引數 | 必填 | 預設值 | 說明 |
|---|---|---|---|
--cluster-id |
是 | — | 叢集 ID |
--invocation-ids |
是 | — | InvocationId 列表(英文逗號分隔,可批次) |
--offset |
否 | — | 分頁起始位置 |
--limit |
否 | — | 分頁大小 |
--region |
否 | ap-guangzhou |
SDK 簽名用的 region(X-TC-Region);DescribeCommandExecution 不受地域限制,預設即可 |
--poll |
否 | false | 是否輪詢直至所有呼叫進入終態 |
--poll-interval |
否 | 5 | 輪詢間隔(秒);過小(如 3s)容易被騰訊雲限流攔截 |
--poll-timeout |
否 | 300 | 輪詢超時(秒),到點仍未終態則按當前快照返回 |
pip3 install tencentcloud-sdk-python
金鑰從環境變數讀取:
export TENCENTCLOUD_SECRET_ID=...
export TENCENTCLOUD_SECRET_KEY=...
三個指令碼統一使用單一接入點,由騰訊雲就近排程:
omics.tencentcloudapi.com
不再按 region 拼接
omics.{region}.tencentcloudapi.com。
| API | --region 含義 |
需要調整嗎? |
|---|---|---|
DescribeHPCClusters |
業務地域——叢集按地域隔離,不同 region 查到的叢集不同 | 是,必須傳對叢集所在的 region(如 ap-shanghai) |
RunCommand |
僅用於 SDK 簽名(X-TC-Region),不限定叢集;主要走 ClusterId 定位叢集 |
否,預設 ap-guangzhou 即可 |
DescribeCommandExecution |
同上,不受地域限制;InvocationId 全域性可識別 |
否,預設即可 |
DescribeHPCClusters 查不到期望叢集時,先確認 --region 是否與叢集實際所在地域一致。RunCommand 與 DescribeCommandExecution 的 --region 可以不一致(不影響語義),但建議保持一致以便除錯習慣一致。describe_command_execution.py --poll 用)下列狀態視為終態(實測樣例已驗證 SUCCESS,其餘以關鍵字兜底):
SUCCESS / Succeeded / SUCCEEDEDFAILED / Failure / FAILURETIMEOUTTERMINATED / Cancelled / CANCELLEDERROR其餘(如 PENDING / RUNNING / INVOKING)視為非終態,輪詢繼續。
服務端實際狀態列舉以 SDK 文件為準;判定使用大小寫不敏感的子串匹配兜底。輪詢時若
ExecutionSet長度 < 入參InvocationIds數量,也視為非終態(部分呼叫還在生成中)。
DescribeHPCClusters 響應| 欄位 | 說明 |
|---|---|
Response.Clusters[] |
叢集清單 |
Response.TotalCount |
命中條數 |
Clusters[].ClusterId |
叢集 ID(如 hpc-kazab9v2) |
Clusters[].Name / Description |
叢集名 / 描述 |
Clusters[].Status |
叢集狀態(如 RUNNING) |
Clusters[].NodeCount |
節點數 |
Clusters[].OsName |
作業系統(如 CentOS 7.9) |
Clusters[].Scheduler / SchedulerVersion |
排程器 / 版本(如 SLURM 23.11.7) |
Clusters[].Type |
叢集型別(如 CVM_CLUSTER) |
Clusters[].VPCId / VPCCIDRBlock |
VPC ID / CIDR |
Clusters[].CreateTime / ConfirmDeadline |
建立時間 / 交付確認截止時間 |
Clusters[].Tags |
標籤 |
RunCommand 響應| 欄位 | 說明 |
|---|---|
Response.InvocationId |
核心欄位,下一步查詢命令執行結果用 |
Response.RequestId |
請求 ID(追溯用) |
DescribeCommandExecution 響應(扁平結構)| 欄位 | 說明 |
|---|---|
Response.ExecutionSet |
陣列,每個 InvocationId 一條 |
Response.TotalCount |
命中條數 |
ExecutionSet[].InvocationId |
對應的呼叫 ID |
ExecutionSet[].ClusterId |
叢集 ID |
ExecutionSet[].Command |
原始命令內容 |
ExecutionSet[].NodeId |
實際執行節點的 InstanceId(如 ins-85ckz3bg,注意是 CVM 例項 ID 而非 node-id) |
ExecutionSet[].Status |
整體狀態(參考終態判定) |
ExecutionSet[].ExitCode |
退出碼(0 = 正常) |
ExecutionSet[].Output |
命令輸出(stdout + stderr 合併;可能截斷,看 OutputTruncated) |
ExecutionSet[].OutputTruncated |
輸出是否被截斷的布林位 |
ExecutionSet[].Duration |
命令執行時長(秒) |
ExecutionSet[].StartTime / EndTime |
執行起止時間(UTC) |
ExecutionSet[].CreatedTime |
呼叫建立時間(北京時間) |
ExecutionSet[].Operator |
操作者 Uin |
指令碼透傳服務端原始 Response,不做欄位裁剪。
## HPC 叢集列表({region},共 {TotalCount} 個)
| ClusterId | Name | Status | Nodes | Scheduler | OS | VPC | CreateTime |
|---|---|---|---|---|---|---|---|
| `hpc-kazab9v2` | 金域遷移測試 | RUNNING | 6 | SLURM 23.11.7 | CentOS 7.9 | vpc-87y9syeb (10.10.0.0/22) | 2026-05-20 11:00:35 |
當
TotalCount > limit,提示使用者用--offset/--limit翻頁。
## 命令下發:{ClusterId}
**Region**:{region}
**InvocationId**:`{InvocationId}` ← 下一步查詢用
**RequestId**:{RequestId}
### 命令內容
```sh
{Command}
提示使用者:如需檢視執行結果,請執行
python3 scripts/describe_command_execution.py --cluster-id {ClusterId} --invocation-ids {InvocationId}或加--poll自動等到終態。
### 查詢階段(DescribeCommandExecution)
按 `ExecutionSet` 逐條渲染,每條一節:
```markdown
## 命令執行:{InvocationId}
**Region**:{region}
**叢集**:{ClusterId}
**執行節點**:{NodeId}
**操作者**:{Operator}
**狀態**:{Status} **退出碼**:{ExitCode} **耗時**:{Duration}s
**建立時間**:{CreatedTime}
**起止**:{StartTime} ~ {EndTime}
### 命令
```sh
{Command}
{Output}
```
如果狀態非終態(如 RUNNING / PENDING)且未啟用 --poll,提示使用者「命令仍在執行中,可加 --poll 自動等待,或稍後重試」。
OutputTruncated=true 時提醒使用者:「輸出被截斷,建議改寫命令為重定向到檔案 + cat 檔案 兩步走」。
雲 API 三段式(DescribeHPCClusters → RunCommand → DescribeCommandExecution)已合併到本文頂部「端到端標準工作流」中作為通用骨架;當用戶的訴求純粹是"在某個叢集上跑一條裸命令"時,把 Step A 的意圖分類標記為"直接走雲 API",Step B 不進入 SLURM/tophpc 命令生成,直接把使用者給的 shell 字串送入 Step D 即可。其他步驟(確認協議、遠端下發、輪詢取回、按"輸出格式"模板渲染)保持一致。
set -e、source ~/.bashrc 等修改;如確有需要必須先與使用者確認rm -rf、覆蓋系統檔案、修改 /etc、sudo 等高危命令,下發前必須先回顯完整命令並請使用者顯式確認(y/yes)--node-id 不傳時由服務端按叢集預設策略排程;實測一般會落在 manager 節點(role=1 那臺)Output 欄位服務端有大小限制,超長輸出會被截斷(看 OutputTruncated);遇到截斷改寫為重定向到檔案 + cat 檔案 的兩步RunCommand 與 DescribeCommandExecution 是全域性介面,不受地域限制;InvocationId 可以跨 region 查。DescribeHPCClusters 是地域介面,--region 傳錯會查不到叢集。三個指令碼統一走統一接入點 omics.tencentcloudapi.com,騰訊雲會就近排程。ExecutionSet[].NodeId 實測返回的是CVM 例項 ID(ins-xxx),不是 HPC 節點 ID(node-xxx);如需對應 HPC 節點,請配合 DescribeHPCNodes 反查DescribeHPCClusters 的過濾是與關係——多個 Filter 同時生效,單個 Filter 內部 Values 是或關係這個 Skill 質量較好,文件詳細、功能齊全,能覆蓋 HPC 叢集管理的常見場景。它把雲 API、作業排程、基礎設施命令都整合在一起,彈性伸縮的坑(dummynode)也解釋得很清楚。優點是操作流程規範、mutating 命令會先確認、用普通使用者跑作業更安全。不足是部分指令碼可能沒測全,文件有個地方被截斷了,輸出結果需要自己解讀。總體適合有一定經驗的使用者使用。