关于nohup的一些使用和命令详解
因为工作原因,有诸多项目和流程需要测试,有时候可能因为各种原因,不小心关闭了ssh客户端,这就会导致一个很尴尬的问题,挂载的任务会终端,如果数据量少的话,重新跑一次流程就好了,万万就怕数据量巨大,在做拼接,比对的时候断一次是真的让人心碎。此时我们可以使用nohup命令来让进程持续运行,不会随着SSH客户端的关闭而结束。
nohup介绍
nohup 命令主要是忽略所有挂断信号,从而使命令任务在后台一直运行下去,当然nohup常与&连用。同时会有一个默认的nohup.out文件输出,主要是用来查看运行过程中的一些输出中间信息等。命令如下
nohup + 所运行的代码
示例 这是我正在运行的一个做数据分析的一个代码
nohup Rscript /database/proteome/Statistics/Labelfree/LabelfreePipeline.R -i ./ -s B
运行命令,结果展示
生成的nohup.out文件则会写成这样
直接在前台运行结果这是会变成这样
关键区别
针对前面两种结果其实有很尴尬的问题,都出现了Error。
对于error来说,nohup,因为只会有输出nohup.out文件,所以不会直接在屏幕显示,这就会让一直没有挂载后台喜欢的你,以为结果没问题,从而进行下一步处理。导致后期各种错误结果,却找不到最初的错误原因。
查看任务
和nohup紧密相关的除了&之外还有还有就是jobs jobs主要的作用就是用来查看挂载在后台的任务有哪些
结果
jobs主要的几种情况就是
情况 | 表示含义 |
---|---|
Running | 正在执行 |
Exit | 有error |
Terminated | 暂停 |
Done | 结束 |
关于jobs的更多信息,后续会有描述
nohup的输入和输出
关于nohup 的输入输出主要有以下几点
code | 标准 | 解释 |
---|---|---|
0 | stdin (standard input) | 标准输入标准输出 |
1 | stdout (standard output) | 标准输出 |
2 | stderr (standard error) | 标准错误 |
nohup code.sh > nohupout.txt 2>&1
>nohupout.txt 表示将标准输出输出到nohupout.txt中,也就相当于 1>nohupout.txt
2> error 表示将错误输出到error文件中
2>&1 也就表示将错误重定向到标准输出上
关于困惑的应该主要是2>&1
这个意思是把标准错误 重定向到标准输出中,而标准输出又导入文件nohupout.txt里面
至于为什么需要将标准错误重定向到标准输出的原因,那就归结为stderr没有缓冲区,而stdout有。这就会导致 >nohupout.txt 2>nohupout.txt 文件nohupout.txt被两次打开,而stdout和stderr将会竞争覆盖,这会是nohupout.txt结果混乱,不是我们想要的
这就是为什么有人会写成:
nohup code.sh >nohupout.txt 2>nohupout.txt出错的原因了