# 控制作业

## 常用控制命令

|命令|功能|
|---|---|
|`bjobs`|查看自己未结束的作业|
|`bjobs -l JOBID`|查看某个未结束作业的详情|
|`bhist`|查看自己已结束的历史作业|
|`bhist -l JOBID`|查看某个已结束历史作业的详情|
|`bpeek JOBID`|查看正在运行某个作业的stdout/stderr|
|`bkill JOBID`|终止某个作业|
|`btop JOBID`|设置作业最先运行|
|`bbot JOBID`|设置作业最后运行|

## 作业状态

`bjobs`命令的作业状态可能值包括：

| 状态       | 描述                                                         |
|------------|--------------------------------------------------------------|
| PEND       | 作业正在等待中。也就是说，作业尚未开始。                       |
| PROV       | 作业已被派发到一个正在唤醒的节能状态主机。在作业可以发送到<br>sbatchd之前，它处于PROV状态。 |
| PSUSP      | 作业在等待期间被挂起，可能是作业所有者或LSF管理员操作的。       |
| RUN        | 作业当前正在运行。                                            |
| USUSP      | 作业在运行期间被挂起，可能是作业所有者或LSF管理员操作的。       |
| SSUSP      | 作业被LSF挂起。                                               |
| DONE       | 作业以状态0终止。                                             |
| EXIT       | 作业以非零状态终止。                                          |
| UNKWN      | 一般是两种情况之一，如果作业状态长时间处于UNKWN状态，一般来<br/>说就是计算节点坏了可以直接杀掉作业。①因为计算节点负载过高，未<br/>能及时获取作业状态导致状态未知，这种情况一般只需要等待即可，待<br/>负载下降获取状态后就正常了。②因为计算节点出现故障且长时间未恢<br/>复，调度系统无法获取作业状态，此时如果登录不到相应的计算节点，<br/>可以直接杀掉作业。|
| WAIT       | 对于提交到块作业队列的作业，块作业中的成员正在等待运行。         |
| ZOMBI      | ①当sbatchd在执行主机上不可达时，非可重新运行的作业被`bkill`杀死，<br>并且作业显示为UNKWN。 ②运行可重新运行作业的主机不可用，并且LSF<br>已将作业重新排队，分配了新的作业ID，就像提交了新作业一样。 ③在执<br>行主机可用之后，LSF尝试杀死ZOMBI作业。ZOMBI作业成功终止后，作业<br>的状态将更改为EXIT。 使用MultiCluster时，当在远程执行群集上运行的作<br>业变为ZOMBI作业时，执行群集将像本地ZOMBI作业一样处理该作业。此外，<br>它还会通知提交群集作业处于ZOMBI状态，并且提交群集将重新排队作业。                             |



## 作业等待
`bwait -w "wait_condition" [-t timeout]`

暂停并等待作业条件满足，不满足一直暂停等待，满足则执行完毕返回。

典型用法：在脚本中不要循环使用bjobs判断作业状态，而用bwait等待作业运行完成，这样更优雅且能显著降低对集群的压力。

- `-w wait_condition`：要满足的等待条件，此表达式与上述`bsub -w`选项的格式相同。
- `-t timeout`：等待条件的超时，范围为1-525600分钟，默认为一年。