在生信分析的过程中,往往一个步骤会非常耗时,如果任务只是放在前台运行,那么不仅妨碍我们继续操作,还会因为网络波动造成任务意外中断,因此对于服务器的使用,我们还必须了解一下如何把任务提交到后台运行。在上一期我们介绍了并行提交任务(玩转服务器—提交并行任务),其中提到了一嘴,把任务放到后台,那么今天让我们来看看还有哪几种常见的实现方法:
nohup ... &
&
:将任务提交到后台。
nohup
:用于让一个任务忽略 SIGHUP
信号,从而防止任务在终端关闭时被终止。
##基本结构
nohup long_running_command &
## 重定向日志输出
nohup long_running_command > output.log 2>&1 &
nohup long_running_command 1>output.log 2>&1 &
注意:如果仅仅是在命令后面加上 &
,这样任务会在后台运行,不会阻塞当前的终端会话,但是此时任务是与终端关联的,如果终端关闭,任务就会被终止。所以通常我们需要搭配 nohup
使用
nohup
会将命令的标准输出和标准错误输出重定向到一个文件(默认为 nohup.out
)> output.log
:将标准输出重定向到 output.log
文件,用于自定义保存程序运行日志文件1
和 2
是标准输出(stdout)和标准错误输出(stderr)的文件描述符。1
: 标准输出(stdout),表示命令的正常输出(通常是命令运行结果的文本或者运行日志)。2
: 标准错误输出(stderr),表示命令的错误信息(比如,执行命令时出现的报错信息)
nohup示例
##新建命令执行的脚本文件
vim st1_umi_white.sh
##提交后台运行
nohup bash st1_umi_white.sh 1>st1_run.log 2>&1 &
screen
screen
允许你创建一个虚拟的终端会话,并在使用期间自由切换。即使你退出或关闭当前的 SSH 会话,任务仍然继续运行。
## 创建一个会话窗口
screen -R
screen -S
#-R 和 -S 都可以创建新的会话窗口,但是建议你使用 -R 创建,因为它可以检查你要创建的窗口是否已经存在。避免重名。
## 退出会话
ctrl+a+d (快捷键)
## 重新进入(恢复)之前创建的会话窗口
screen -r
## 关闭会话
screen -X -S quit
# 也可以在进入screen_name后 ,执行 exit
## 查看当前所有会话
screen -ls
screen示例
##创建虚拟会话
screen -R nowhite
##提交命令
time awk 'BEGIN { while (getline 0) { barcodes[barcode]++; } } } END { for (barcode in barcodes) { print barcode, barcodes[barcode]; } }' ../Drug96-1_L4_Q10182.R2.fastq > barcode_allreads_R2.txt
bg 和 fg
ctrl + z
:可以将一个正在前台执行的命令放到后台,并且暂停bg
命令用于将一个被暂停的进程(通常是通过 Ctrl + Z
暂停的进程)继续在后台运行。它是“后台”命令的缩写,可以让你在不中断任务的情况下将它移到后台继续执行。disown
命令用于将一个或多个后台任务从 shell 的作业控制列表中移除。使用 disown
后,这些任务将与当前 shell 会话脱离关联,意味着任务将不再受到终端信号(如 SIGHUP
,当终端关闭时)影响,任务将继续运行,即使你退出当前会话或关闭终端。
正在前台运行的任务放后台
如果你有一个在前台运行的耗时任务,并希望将其转移到后台,那么你可以:
- 如果你计划要关闭终端,并且希望任务继续运行,不受终端退出的影响,那么可以执行
disown
- 如果你会保持终端打开直到任务完成,则不需要使用
disown
time awk 'BEGIN { while (getline 0) { barcodes[barcode]++; } } } END { for (barcode in barcodes) { print barcode, barcodes[barcode]; } }' ../Drug96-1_L4_Q10182.R1.fastq > barcode_allreads_R1.txt
# 按ctrl z 键,暂停命令
jobs
# 查看后台进程,可以看到任务暂停
bg %1
#把后台暂停的1号任务放到后台继续运行,这样就把前台任务放到了后台运行,返回了命令提示符,可以继续进行其他操作
R 脚本后台执行
如果你在使用Rstudio-server运行代码的时候,需要长时间运行,那么就需要写成R脚本,通过nohuo或者screen 提交到后台运行。具体可以参考:运行耗时比较长的代码就需要后台运行了
nohup Rscript myscript.R > output.txt &
提交后台的R脚本需要注意两点:
- 确保你的R脚本在运行时不需要任何用户交互。否则,你的R脚本可能会在需要用户输入时停止运行。
- 定义好传参参数。R 提供了
commandArgs()
函数来获取从命令行传递给 R 脚本的参数。你可以在 R 脚本中使用该函数来处理传递的参数。
R脚本提交示例
这里我们演示一个10x单细胞的读取:
# 加载必要的库
library(Seurat)
# 获取命令行传递的参数
args TRUE)
# 检查参数个数
if (length(args) != 2) {
stop("请提供数据文件夹路径和输出文件路径。")
}
# 获取传递的参数
dir 1] # 数据文件夹路径
output_file 2] # 输出文件路径
# 获取所有样本的文件名
samples
# 显示样本列表
cat("样本文件:", samples, "\n")
# 处理每个样本并创建 Seurat 对象
sceList function(pro) {
cat("正在处理样本:", pro, "\n")
# 读取数据
tmp cat("数据维度:", dim(tmp), "\n")
if (length(tmp) == 2) {
ct 1]]
} else {
ct }
cat("counts 维度:", dim(ct), "\n")
# 创建 Seurat 对象
sce project = gsub('GSM[0-9]*_', '', pro),
min.cells = 5,
min.features = 300)
return(sce)
})
# 合并所有 Seurat 对象
sce.all 1]], y = sceList[-1], add.cell.ids = samples)
# 显示 RNA 层次的名称
cat("RNA 层次名称:", names(sce.all@assays$RNA@layers), "\n")
# 显示 RNA counts 数据
cat("RNA counts 数据维度:", dim(sce.all[["RNA"]]$counts), "\n")
# 保存最终的 Seurat 对象到指定路径
save(sce.all, file = output_file)
cat("Seurat 对象已保存到:", output_file, "\n")
shell命令提交:
nohup Rscript read_10x.R GSE247844_RAW/ ./GSE24788.Rdata 1>read.log 2>&1 &
在Rstudio-server代码编辑区编辑R脚本,在Terminal端可以直接提交后台运行
如果你也需要共享服务器,详见:满足你生信分析计算需求的低价解决方案福利抢购方式