# 高性能集群作业信息记录表模板教程

有时候我们在唐楼HPC上计算任务，想要较为准确地知道当前计算进展（例如，刚刚提交或者计算结束，又或者多个计算阶段到哪了），但是面临一堆Output文件不停`cat`、`grep`、`bpeek`很不优雅……

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694246004814.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694246004814.png)

为了比较准确知道自己的作业当前的状态，有很多种方法，集群用户大多是这三种做法：

1. 方法一<span style="color:red;">（千万别这么干系列）</span>：自己写个**无限循环**的脚本不停查询然后维持校园网外网访问，检测到后通过SMTP给自己发邮件。作为eScience高性能计算交流群的年更节目，此方法几乎没有任何优点，**不仅浪费一个校园网终端、邮件有概率被过滤、浪费大量登录节点资源导致其他用户也卡顿**，还有可能**得到集群管理员姚老师的特！别！关！照！**
2. 方法二：使用`bwait`命令（详细用法自行搜索）在任务后执行通知，优点是够简单，缺点是登录节点如果出了什么问题，该命令也会失效。
3. 方法三：直接将通知脚本集成在任务脚本里，放在任务前后执行。

本文将重点介绍方法三。你可能会说，那方法三不还是需要SMTP发邮件吗？

非也，如果你知道以下三个事实：
+ 协同表格（table.nju.edu.cn）和计算节点直接连通，而且同属内网**无需登录校园网账号**
+ 协同表格支持Webhook/邮件消息通知，其中Webhook包括**企业微信机器人**和**钉钉机器人**，甚至自定义Webhook
+ 大多数手机系统都已经支持企业微信和钉钉的系统级推送（指**无需后台驻留应用也能收到通知**）

那么你就可以自然想到：通过协同表格的API从HPC计算任务提交信息至表格，然后利用表格自动化实现消息推送提醒；既能统一记录信息，方便后期统计分析计算效率，又可以实时通知，妙啊~

那么，如何实现这一构想呢？

## 创建表格文件

### 获取模板

在协同表格的模板页，点击**科研-HPC作业信息记录表**，使用此模板：

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694247345505.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694247345505.png)

这个模板预设的列名可以不用修改，因为后面的脚本预设的就是这些列名：

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694247533953.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694247533953.png)

### 创建自动化

首先，打开钉钉或企业微信（本文以企业微信为例），在群聊内创建一个**群机器人**

[![创建群机器人](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694247689624.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694247689624.png)

之后，复制Webhook地址

[![复制Webhook地址](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694247775339.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694247775339.png)

回到之前创建的表格，我们打开**第三方集成**

[![“第三方集成”在“...”点击后的菜单中](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694247847793.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694247847793.png)

可以看见，表格支持发送邮件/企业微信机器人/钉钉机器人。本文我们主要关注机器人，因此邮件就暂时略过了。

[![第三方集成界面](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694247958844.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694247958844.png)

在此处，我们添加一个企业微信机器人并粘贴刚才的Webhook地址

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694250353881.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694250353881.png)

测试可以发送消息，即设置完毕。

> 如果你需要更高级的Webhook触发其他外部工作流来实现更加强大的自动化，可以选择另一种方式
> 
> [![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694248261491.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694248261491.png)
>
> 此自定义Webhook会被所有新增、复制、删除、修改行操作触发，并以特定的格式发送消息。详情见[官方手册](https://seatable.io/en/docs/webhooks/struktur-der-webhook-daten/)。

打开表格的**自动化规则**，新增一条规则：

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694250482956.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694250482956.png)

在规则中，我们设置只要新增记录的任务状态列“不是空”，

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694250535239.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694250535239.png)

然后增加一个动作，动作类型为**发送企业微信**，并选择刚才我们在“第三方集成”创建的那个企业微信机器人

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694250611949.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694250611949.png)

如果你想要“花里胡哨”一些，可以选择Markdown格式，并且按照[企业微信机器人官方文档](https://developer.work.weixin.qq.com/document/path/91770#markdown%E7%B1%BB%E5%9E%8B)的Markdown格式要求配合{列名}引用的模板语法来撰写。钉钉机器人同理。

下面是一个企业微信机器人的例子：
```md
集群任务新动向：
>任务ID：<font color="warning">**{任务ID}**</font>
>队列信息：**{队列}**
>节点信息：**{节点}**
>任务状态：<font color="info">**{任务状态}**</font>
```
保存这个自动化规则。至此，自动规则设置完毕。

## 获取脚本

在eScience的[Seatable-Reporter代码仓库](https://git.nju.edu.cn/escience/seatable-reporter)中，找到`seatable-reporter-LSF.py`文件，这就是脚本了。你可以把这个脚本放置在你的home目录下或其他什么地方，本文示例放置在`~`下面。

这个脚本配合上边的模板，什么也不用修改，可以直接拿来用。

## 使用脚本

### 获取Base API Token
脚本读取两个重要的环境变量：`SEATABLE_HOST`与`SEATABLE_BASE_TOKEN`，其中前者对协同表格用户而言填写`table.nju.edu.cn`即可，后者需要自行填写之前创建表格的API Token。

API Token的获取方式：

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694252581217.gif)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694252581217.gif)

获取后，通过`export`命令将上述内容写入环境变量：

```sh
# 偷懒的话，可以直接加到`.bashrc`里面去
export SEATABLE_HOST=table.nju.edu.cn
export SEATABLE_BASE_TOKEN=<刚刚获取的API Token>
```
### 提交计算任务

由于提交作业之前的`alias`无法继承至LSF作业环境里，为了简单起见可以在LSF作业脚本开头写入命令，例如叫`mylog`。

在你想要的地方，直接`mylog`你想要的信息即可，消息便被发送至协同表格。以下是一个示例LSF作业脚本，
```sh
#BSUB -q 7702ib
#BSUB -n 1

alias mylog="python ~/seatable-reporter-LSF.py"

mylog "提交任务"
<your job>
mylog "计算结束"

```

表格上便会获得此消息

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694252970362.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694252970362.png)

当然，根据计算任务不同，你也可以自定义更多的状态信息。表格接收到新的记录提交，便会触发自动化，在手机上相应提醒：

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694253134803.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694253134803.png)

此外，表格本身留下的记录也可以用于一些信息统计——

[![](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/scaled-1680-/image-1694253277571.png)](https://doc.nju.edu.cn/uploads/images/gallery/2023-09/image-1694253277571.png)

## 结语

本文主要实践通过协同表格与HPC的联动，在纯内网环境实现了低成本的计算任务实况通知。

事实上，类似的自动化案例在eScience的各种服务中比比皆是。得益于eScience多个服务的灵活性，看似不相关的服务平时各司其职；一旦互相协同，就能在小至办公智能化，大至工作自动化的各方面有很大便利。