生信Log32|NEXTFLOW资源统计脚本知识点一览——生信bash进阶学习材料
文前唠叨,这篇断断续续写了好久啊,最近开始看一些流程搭建的相关知识和软件,最早接触的是snakemake,但仅跟着大佬玩过一下教学视频的demo,对此并没有深入的理解。最近因自己的懒癌犯了,不想一遍又一遍地敲那些重复的命令行就开始接触流程的东西。Nextflow是我接触到的比较满意的流程工具,这次尝试站在开发者的角度去理解。本篇记录的是研究nextflow --with-trace这个功能实际执行脚本所学到的内容。在分析和尝试读懂这个脚本的过程中,我还发现了很多软件的编写使用的是高级语言,但实际运行的过程当中,机器执行的是高级语言生成的bash脚本。最后啰嗦一句,这个脚本串起了很多linux的知识点,不失为一个进阶学习linux bash/shell/系统知识的集成范例。题外话,我经常思考学会这个了,but what's next。
0、思路
一句话总结就是ALL ABOUT LINUX的文本信息获取
- 关于/proc/目录:linux
/proc/
目录下存放着正在运行的进程信息(文件内的文本信息并进行统计)如内存消耗、使用的CPU核数、进程运行时间等等,此外还可以通过这个目录查看到机器的物理CPU核数、内存有多少(更多linux /proc目录的内容请查看下方参考手册)。
- /proc/$PID目录
- /proc/$PID/stat记录的内容
1、NEXTFLOW资源统计脚本知识统计一览
涉及到的主要内容有以下(当然这只是其中几个大块内容):
- 函数构建及参数输入
- bash的控制流(for, if else)
- 标准输出、输入和文本重定向
- 获取文本信息、字符的处理(如:文件路径的截取)
2、Nextflow资源统计的脚本设计思路一览
脚本目的:计算脚本执行时消耗的资源(获取集群计算节点运行的信息)
脚本主要执行步骤:
- 打开文件(所幸linux不需要像python那样把文件打开关)
- 读取内容(如何将读取到的内容存放到内存中,涉及到全局/局部变量和数组的构建)
- 对获取到的数据进行统计(不同系统存在差异,条件的判断)
- 将结果写入到对应的文件中(文件内容重定向)
3、知识点一览(更多内容查阅linux shell手册大全)
- 如何在bash里面定义函数及函数基本结构
#函数的基本结构
function function_name {
your func
}
#如何在脚本中定义局部变量使用local
function function_name{
local test=test
}
#全局变量只需在函数外部写即可
global_var="anything"
#如何获取外部参数并读到function中, 用$1-$9的位置获取外部参数,$1代表第一个位置上的参数
e.g bash hello_world.sh output_dir
output_dir=$1
function function_name {
your_command $1
}
- 控制流&条件判断
#如何在bash中进行条件的判断及分支的基本结构(回文结构)
if [ condition ]
then
#做点事情
do XXX
else
#干其他事情
do XXX
fi
# while判断
while condition
do 命令
done
#用双括号进行条件判断,如双括号判断路径中是否存在文件等
if [[ -f 文件名 ]]
- 读取文本内容
#cat、awk、read
content=$(cat file_name)
#awk
content=$(awk '{print')
#read经常与while连用,用于逐行读取文本的内容
while read line
do echo $line
done < input_file
#构建数组
array=(0 0 0)
- 输出内容(重定向输出输入)
#输出到指定文件
cat file > another_file
#追加输出到某文件
cat file >> another_file
#重定向输入,这种结构能让脚本变得简介和更容易理解,而且避免了管道的输入
while read line
do echo $line
done < input_file
#如何将不输出脚本标准错误,1通常为脚本正常的输出内容,2一般是平时屏幕上的报错信息
echo 2>/dev/null
- 其他零碎的知识点
#如何得知自己是在什么系统上是linux还是macos
uname
#如何获取命令/指令运算后的值:用$(命令) 的方式完成
system=$(uname)
echo $system
#如何获取脚本/文件的名字(主要用在有绝对路径的文件上)
filepath=/Users/User/control.sh
basename $filepath
output: script.sh
#用basename命令去掉文件后缀
basename -s .sh doc_name.sh
output: doc_name
#如何获取路径(主要用在有绝对路径的文件上)
filepath=/Users/User/control.sh
dirname $filepath
/Users/User/
#如何获取脚本的PID号
bash hello_world.sh &
PID=$!
echo $PID
总结
- 在这过程中,发现bash脚本干的很多事情都是找路径,确定路径和进行文本的截取。所以小白同志们遇到问题不需要太惊慌,遇到的大部分bug都可能跟机器找路径找不到有关系或者软件的依赖包还没有安装好有关。
PS:在此跟大家推荐一本教材叫《Linux命令行与shell脚本编程大全》
。对于新手来说,尽快上手代码项目并参考理论书籍,学习效果会更好。
参考
《Linux命令行与shell脚本编程大全》
网友评论