BaneTask
Last Update: 2026/03/04
BaneTask 是一个用 C++17 编写的量子化学任务控制/工作流生成工具。本程序的目标不是像agent一样替你算,而是按照你的要求把你从输入文件批量生成、任务依赖串联、前后处理脚本拼装、结果落盘整理这些重复工作里解放出来:你只需要写一个相对简洁的 .bt 文本文件描述流程,BaneTask 会在目录中生成对应的工作流脚本文件。
核心理念很简单:
- 用 任务块(
$taskname)表达计算步骤,用%source表达依赖关系。 - 用
define:在文件头定义变量,后续用[变量名]做替换。 - 把“跑前准备/跑后处理”写到
%preprocess / %process,自动落到每个任务目录的pre_comd / comd。
项目地址:
- GitHub: https://github.com/bane-dysta/banetask
- Gitee: https://gitee.com/bane-dysta/banetask2
安装与快速开始
把发布的可执行文件(或你自己编译出来的 banetask / btask)加入 PATH:
1
export PATH=/path/to/banetask/bin:$PATH
帮助:
1
banetask --help
它会打印当前读取到的配置文件路径、各环境变量当前值,以及默认的配置搜索路径。
BaneTask 本身只负责生成工作流脚本,不强绑定具体队列系统。你可以用banetask提供的调度器
run.sh,也可以自己按需求编写任务调度器,或是直接进入任务目录手动执行其中的命令。
配置与目录结构
banetask.conf 的查找规则与优先级
BaneTask 会按以下顺序查找 banetask.conf:
- 当前目录(
.) banetask可执行文件所在目录~/.banetask//etc/banetask/
同一个配置项的优先级固定为:
环境变量 > 配置文件 > 内置默认值。
因此你可以把“常用默认值”写在 ~/.banetask/banetask.conf,而在 CI/集群节点上用环境变量做覆盖。
配置
建议把所有可移植、可复用的资源集中到 ~/.banetask/(Windows 下对应 %USERPROFILE%\.banetask\),典型结构如下:
1
2
3
4
5
6
7
8
9
~/.banetask/
banetask.conf
envs/ # 各程序运行环境配置(*.conf)
bt_templates/ # btask 用的 .bt 模板
other_templates/ # %program other 用的输入模板
scripts/ # 可选:供 scripts/autorun 使用的脚本集合
wfn_examples/ # 可选:multiwfn 模板/输入流示例
external/ # 可选:env.sh / env.bat 之类的统一环境初始化
banewfn/ # 可选:banewfn 子系统脚本(如你需要)
banetask.conf 是一个简单的 KEY=VALUE 文件。你不需要把所有变量都写满;只要写你需要覆盖的项即可。下面是与源码行为一致的“路径类变量”含义说明(括号内是默认值或典型用法):
BANETASK_TASK_PATH:当你 不带参数运行banetask时,用它作为“任务搜索根目录”(默认.)。BANETASK_LOG_PATH:banetask 自己的日志输出目录(默认.;通常你可以设置成与BANETASK_TASK_PATH相同)。BANETASK_ENVCONF_PATH:程序环境配置目录(默认~/.banetask/envs)。BANETASK_TEMPLATE_PATH:btask的模板目录(建议指向~/.banetask/bt_templates;若不设置,btask会尝试使用./conf/bt_templates)。BANETASK_OTHER_TEMPLATES_PATH:%program other的输入模板目录(默认~/.banetask/other_templates)。
下面这些是“可选能力”才会用到的路径(不配置也不影响基础工作流生成):
BANETASK_SCRIPTS_PATH:后处理指令中的scripts ...、以及autorun: true时的run.sh/run.bat所在目录(默认~/.banetask/scripts)。BANETASK_EXTERNAL_SCRIPTS_PATH:生成的pre_comd/comd会优先尝试加载这里的env.sh(bash)或env.bat/env.cmd(cmd)做统一环境初始化(默认~/.banetask/external)。BANETASK_WFN_EXAMPLES_PATH:multiwfn指令使用的模板/输入流目录(默认~/.banetask/wfn_examples)。BANETASK_BANEWFN_PATH:banewfn指令用到的脚本目录(无默认值;你需要时再配)。
另外还有一个与依赖判定相关的开关:
IF_WAIT_FREQ:依赖任务完成性检查时的策略开关(布尔值,默认行为以源码为准)。如果你遇到“日志很大/频率输出很靠前导致尾部检测不稳”的情况,可以通过它调整检查方式。
量子化学程序环境
BANETASK_ENVCONF_PATH 目录下的 *.conf 用于告诉 BaneTask:
- 这个程序的输入文件后缀是什么(用来在任务目录里找到要跑的输入)。
- 跑之前需要怎样 ENV_SETUP(加载模块、设置环境变量等)。
- 真正执行计算时要用怎样的 RUN_CMD_TEMPLATE。
源码要求每个环境配置文件至少包含三项:
SUFFIX:输入文件后缀(不带点),例如gjf/inp/sh。ENV_SETUP:执行前的环境准备命令。RUN_CMD_TEMPLATE:实际执行命令模板。
并且支持以下模板变量(由 BaneTask 在生成 .bwrk 时替换):
${ACTUAL_INPUT_FILE}:本段工作流实际要跑的输入文件名(例如opt_methane.gjf)。${ACTUAL_OUTPUT_FILE}:本段工作流的输出文件名(默认与输入同名换后缀,通常是.log;可用OUTPUT_SUFFIX配置)。${CORES}:本段工作流使用的核数。
配置文件是 KEY=VALUE 形式,同时支持用单引号包裹多行值(常用于 ENV_SETUP):
1
2
3
4
5
6
7
8
9
10
11
# g16.conf(示例)
CONF_CORES=32
CONF_MEMORY=96000
SUFFIX=gjf
OUTPUT_SUFFIX=log
ENV_SETUP='source "$HOME/apprepo/gaussian/16-hy/scripts/env.sh"
export GAUSS_SCRDIR="$HOME/scratch"'
# 这里给出一个“可移植”的写法:显式把输出导向 ${ACTUAL_OUTPUT_FILE}
RUN_CMD_TEMPLATE='g16 "${ACTUAL_INPUT_FILE}" > "${ACTUAL_OUTPUT_FILE}"'
约定的文件名:
- Gaussian:优先找
g16.conf,找不到再找gaussian.conf - ORCA:
orca.conf - Script:
script.conf - Other:由
prog字段决定,例如xtb.conf
如果你希望在 Windows/cmd 下使用这些配置,
ENV_SETUP和RUN_CMD_TEMPLATE里就应该写 cmd 语法(例如call xxx.bat、set VAR=...)。BaneTask 不会自动把 bash 命令翻译成 cmd。
Windows 与 Shell 选择
为了让同一套 .bt 在 Linux/macOS(bash)与 Windows(cmd)都能工作,源码里引入了“脚本输出 shell”选择:
- 非 Windows 平台默认输出 bash 风格脚本。
- Windows 平台默认输出 cmd 风格脚本。
你可以用配置/环境变量强制切换(留给未来 Git Bash 兼容):
BANETASK_SHELL:可设为bash/sh/gitbash或cmd/bat/powershell(会按类别归入 bash 或 cmd)。USE_GITBASH=true:在 Windows 上强制使用 bash 输出(优先级高于默认)。BANETASK_CMD_ENABLE_DIRECTIVES=true:仅在 cmd 模式下有意义。默认 cmd 模式会把%preprocess/%process里的每一行都当作“原始命令行”写入脚本,不再解析copy/scripts/result...这类内置指令;打开该开关后才会启用这些指令解析。
autorun: true 的行为也会随 shell 变化:
- bash 模式下尝试调用
BANETASK_SCRIPTS_PATH/run.sh - cmd 模式下尝试调用
BANETASK_SCRIPTS_PATH/run.bat
归档链路(
banejs --archive/--soc)在 Windows/cmd 模式下默认不会写入comd,以避免生成无效命令。
bt 任务文件
文件头:元信息、define、include
一个 .bt 文件由两部分组成:
- 文件头(YAML-like):用于写元信息与
define:变量。 - 若干任务块(
$taskname):每个块描述一个步骤。
文件头示例:
1
2
3
4
5
6
autorun: true
define:
func: B3LYP
basis: 6-31G(d)
solvent: water
define:下的键值会以[func]、[basis]的形式在后续内容中替换。autorun: true会让 BaneTask 在生成comd时额外追加一条run.sh/run.bat --path ..(若该脚本存在)。
源码还支持两种“拆分/复用”的 include 机制,适合把私人配置与公共模板分离:
#INCLUDE path/to/file.yaml:只能出现在文件头区域,用来把额外的 header/define 合并进来。&INCLUDE path/to/file.bt:出现在任务区,用来把另一份.bt/.projbt里的任务块并入当前文件。
此外,如果 .bt 所在目录里存在以下文件,会被自动加载:
extra.yaml:在解析完当前.bt文件头后追加解析(常用来放“这个目录特有的 define”)。extra.bt:在解析完当前.bt任务块后追加解析(常用来放“这个目录特有的额外任务块”)。
任务块:依赖、输入生成与控制
每个任务块以 $任务名 开头,例如 $opt、$sp。任务名会用于创建输出目录(例如 opt/、sp/),也会参与生成输入文件名。
任务块中常用的指令如下:
1)%program:程序类型
gaussian(默认)orcaother:走“模板驱动”的其他程序接口(由模板与.other_task决定)script:生成一个可执行脚本(.sh)作为“输入文件”,并由script.conf定义如何运行
2)%source:结构来源与依赖
%source 同时决定“从哪里取几何结构”和“依赖哪些前置任务完成”。支持:
origin:使用与.bt同名(或可推断同名)的原始结构文件(.xyz/.gjf/.com/.log)。任务名:从任务名/目录下提取输出结构(默认从任务名_[originname].log提取)。任务名 guess:Gaussian 专用。除提取结构外,还会写入%oldchk并启用guess=read。restart:从当前任务的旧.log中提取结构并“重启”;旧结果会被移动到fail/目录以避免覆盖。xyz=文件名:从指定的文件名.xyz读取结构(默认在.bt所在目录下找)。- 多依赖:用逗号分隔,例如
opt,N+1,N-1。其中第一个依赖用于取结构/guess,其余依赖只用于“完成性检查”。
3)%control:资源与条件控制
totcore 32/totmem 96000:覆盖该任务块的资源(也会反映到.bwrk的 YAML 头)。runifdef [SOMEVAR]:条件任务块。如果替换后仍然包含[](通常表示变量未定义),该任务块会被跳过。verbosity p|t:Gaussian 路由行用#p/#t(默认#)。
4)%keywords 与 %extrakeywords:输入内容
%keywords:主关键词。Gaussian 会自动补#前缀,ORCA 会自动补!前缀。%extrakeywords:附加块,以end exkwd结束。用途取决于程序:- Gaussian:写在坐标之后(例如额外的输入段)。
- ORCA:写在关键词行之后(例如
%tddft等块)。 - Script:作为脚本正文;
%keywords则用于 shebang(例如/bin/bash)。
源码支持在 %keywords 中使用 {a,b,c} 做“关键词集合展开”,会生成多份输入文件并分别生成 .bwrk。注意:展开项会被用作文件名前缀的一部分。
5)%mod:电荷与自旋修正
可对 charge / spin 做赋值或加减,例如:
1
2
3
%mod
charge add 1
spin set 1
前后处理脚本:pre_comd 与 comd
%preprocess 与 %process 并不会在生成阶段执行,而是写入任务目录下的两段脚本:
pre_comd:在主程序运行前执行comd:在主程序运行后执行
脚本里支持四个内置占位符(生成脚本时替换):
[taskname]:任务名($...的名字)[originname]:原始结构名(通常是.bt的基名)[inputname]:默认是[taskname]_[originname][rootname]:.bt所在目录名(常用来保持跨目录一致命名)
在 bash 模式 下,BaneTask 还提供了一些“内置指令”用于简化后处理书写(你可以把它们理解为宏/快捷命令):
scripts ...:调用BANETASK_SCRIPTS_PATH下的脚本copy ...:文件复制快捷写法(会展开成cp -r)result / results ...:把指定产物收集到../Results/[inputname]/multiwfn .../banewfn .../analysis .../benv ...:与个人工具链联动的快捷入口
在 cmd 模式(Windows 默认) 下,为避免与 Windows 内置命令(例如 copy)冲突,源码默认不解析上述内置指令,而是把每一行都当作原始命令写入脚本。你只要在 %preprocess/%process 中写正常的 .bat/cmd 命令即可。
如果你确实希望在 cmd 模式下也启用这些内置指令解析,可以设置 BANETASK_CMD_ENABLE_DIRECTIVES=true,但这通常意味着你要准备一套对应的 .bat 脚本体系或直接切到 Git Bash。
归档(开发中)
当任务块包含 %archive 时,BaneTask 会在任务目录生成 任务名_archive.json,用于把“任务元信息 + 归档诉求”传递给外部归档工具(例如 banejs)。
示例:
1
2
3
%archive
strucid 00123
properties {freq,tddft,log_file,fchk_file}
源码还会根据关键词做一些自动补全:
- 关键词包含
freq会自动加入freq - 关键词匹配 TD-DFT(
td/td=/td(等)会自动加入tddft - Gaussian 任务默认会加入
log_file与fchk_file
是否以及如何执行真正的归档,是你自己的工具链决定的;BaneTask 只负责生成 JSON,并在 bash 模式下可选把
banejs命令写入comd。
运行产物与目录约定
假设你的 .bt 文件位于某个分子目录(例如 methane/methane.bt),BaneTask 的约定是:
- 在
.bt同级目录下,为每个任务块创建一个子目录:opt/、sp/…… - 在任务目录中生成输入文件、对应的
.bwrk、以及pre_comd/comd。
常见文件如下:
opt/opt_methane.gjf、opt/opt_methane.chk:Gaussian 输入与 chk(是否包含 nproc/mem 取决于%control)sp/sp_methane.inp:ORCA 输入*/pre_comd、*/comd:前后处理脚本(shell 由BANETASK_SHELL/USE_GITBASH决定)*.bwrk:工作流文件(每个输入文件一个.bwrk)bt.status:位于.bt所在目录,用于记录哪些任务块已生成过工作流(用于跳过重复生成)
如果你只想刷新 pre_comd/comd(以及归档 JSON),而不希望改动/新增 .bwrk,可以使用:
1
banetask your.bt --comd-only
该模式不会修改 bt.status。
命令行工具
banetask 主程序
常用方式:
banetask your.bt:解析.bt,按依赖关系生成输入、脚本与.bwrk。banetask your.bt --comd-only:只重新生成/覆盖pre_comd / comd(以及归档 JSON),不生成新的.bwrk,也不会改写bt.status。
一些辅助选项(以 --help 输出为准):
-d, --debug:打开更详细的日志-l, --log <path>:指定日志文件输出路径
另外,如果你 不提供 task file path,banetask 会在 BANETASK_TASK_PATH 下递归搜索 .bt 并逐个处理(适合批处理目录)。
btask 辅助工具
btask 是配套的模板/批处理工具,主要用于生成/合并 .bt 模板、重置状态、以及(可选)项目化批处理:
btask -t:创建测试文件夹和示例文件btask -r:删除当前目录及子目录下的所有bt.statusbtask -l:列出可用模板btask -i:交互式选择模板并生成.btbtask -m opt freq -o task.bt:合并模板并输出
示例
下面给一个“Gaussian 优化 + ORCA 单点 + 简单后处理”的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
autorun: false
define:
func: B3LYP
basis: 6-31G(d)
$opt
%source origin
%program gaussian
%control
totcore 16
totmem 64000
%keywords "opt freq [func]/[basis]"
%process
echo "OPT finished: [inputname]"
$sp
%source opt
%program orca
%control
totcore 32
totmem 96000
%keywords "wB97M-V def2-TZVP def2/J RIJCOSX TightSCF"
%process
echo "SP finished: [inputname]"
如果你希望在 Windows/cmd 下使用,上面的 %process 直接写 cmd 命令同样可行;真正需要注意的是 envs/*.conf 里的 ENV_SETUP/RUN_CMD_TEMPLATE 也要写成 cmd 语法,或者把 BANETASK_SHELL 切到 bash 并在 Git Bash 中执行。