1.目的
使用网页进行数据分析,降低分析所需的技术门槛。
2.其中关键技术包括:
- 网页运行命令: 设置和上传文件,点击开始运行
- 网页运行耗时命令:怎么获取每个任务的状态和输出?
- 前台拼接命令,传到后台
- 后台生成凭据(用户名+时间戳)
- 把凭据记录到history文本文件,
- 在命令前添加echo 状态码>凭据.status.txt,命令后添加 echo $? >凭据.status.txt文件
- 命令本身修改为 cmd | tee -a 凭据.log.txt
- 开启多线程,执行命令:
echo -1> status && cmd | tee -a log && echo $? > stats
- 前台使用ajax监控 status文件,在非负之前一直开启长轮询。-1表示运行中,0表示运行成功,其他表示运行失败。
- 后台返回log.txt文件,并记录到网页端。
- 怎么停止任务?由于命令中有
用户名+时间戳
凭据,后台使用ps -aux | grep 凭据
能找到具体任务的pid,反映给前台显示出来。前台可以点击关闭,后台kill该任务。- 问题:常规执行
echo 7788 && cmd && echo $?
不行,因为每个语句分别执行,grep 7788啥都没有,因为echo已经瞬间执行完毕。想使用 7788 就需要把整个语句当作一个命令来执行。可行的方法是放到bash -c "echo 7788 && sleep 50 && echo $?"
,因为bash -c 把其后的字符串当作一个命令,这时使用ps -aux | grep 7788
是可以匹配到该命令的,进而拿到其pid。 - grep 不能匹配到的方案:
- grep 能匹配到的方案:
- 问题:常规执行
- 怎么使任务暂停和继续?比如突然停电,或者为了防止停电主动暂停。
- 可能需要使用 snakemake / nextflow / cwl 实现暂停和继续。
- //todo 来电后任务继续怎么实现?
- 为了不影响整个服务,最好使用容器化技术。方便开发/部署/扩容。
- 一个任务一个容器又太重,最好做成服务:
- 简单实现:做好目录映射,接收post参数,处理后输出到宿主机文件。
- 效果:web服务和生信服务可以分开开发,松耦合。防止生信包安装失败导致整个服务暂停。
- 一个任务一个容器又太重,最好做成服务:
定时任务?//todo
- 系统自带的 crontab
- 语言支持的: //todo
后台执行队列调度 //todo
- 控制资源的分配?
- 控制一次运行的任务个数?
- 监控硬件使用情况,空闲比例