若是一个命令须要长时间在服务器上运行,那么不少时候会用到nohup命令,这时即使远程登陆ssh中断了与服务器的联系,那么在服务器上运行的命令也不会所以而被迫中止。shell

一般状况下,nohup与&连用,&的意思是将该命令放在后台执行。以下:bash

nohup example.sh &

将exmaple.sh经过&放在服务器后台运行,nohup确保了即使当前ssh远程链接中断,example.sh仍然可以不受影响,继续在远程服务器中运行。服务器

最近有两个配对测序文件,须要比对到参考基因组上,经过bwa能够完成,同时因为该文件比较大,运行时间长,为了不网络链接不稳定形成ssh中断,使用nohup网络

nohup bwa mem ref.fa read1.fq.gz read2.fq.gz > read12.sam &

将两个测序文件合并并生成sam文件。

写好命令,一个回车键按下去,“啪”一声,那就一个爽。而后不用管它,十余个小时以后,果真生成了一个很大的文件read12.sam文件。

可是,当用该sam文件生成bam文件时,提示错误sam文件存在错误!!!【十余个小时的计算白费了】

仔细检查了一下sam文件,发现程序运行的结果和程序运行过程当中的说明输出到了同一个文件中!app

一、标准输出和标准错误

标准输出(standard output)即结果默认的输出地方,好比在bash中,ssh

$ echo 'hello'

hello

在默认状态下,’hello’时输出到你的终端(terminal)上显示。

再如,经过cat命令显示一个文本文件,ide

$ cat hello.txt

Hello!

This is a test!

可是,若是这个文本文件在当前路径下不存在,在会输出错误:this

$ cat No_exist.txt

cat: No_exist.txt: No such file or directory

这时的输出内容“cat: No_exist.txt: No such file or directory”就是标准错误(standard error)。code

二、重导向输出

默认状况下,标准输出和标准错误都会在终端显示。若是要将标准输出不是输出在终端,而是输出到一个其余文件中,这个时候就是重导向输出,能够经过“>“符号来完成。ip

echo 'hello' > hello.txt

将“hello”输出到hello.txt文件中,系统会新建立该文件,若是路径中存在该文件,旧的文件将会被覆盖。

还可使用”>>”符号,这样不会覆盖旧文件,会将”hello”添加到旧文件中。

那么,这儿有一个问题,是否是全部输出到终端的内容均可以重导向输出到一个文件中?好比,若是是标准错误,可否经过”>”输入到文件中?

$ cat No_exist.txt > output.txt

cat: No_exist.txt: No such file or directory

结果证实:不能!output.txt依旧是一个空文件,而错误内容并无出如今该文件中,依旧在终端显示!因此不能直接经过”>”将标准错误输出到文件中!

那么应该怎样才能将标准错误输出到文件中呢?

三、文件描述符

在bash中,一般使用3个整数来表示标准输入(0)、标准输出(1)和标准错误(2)。

若是要把标准错误输出到文件中,可使用

cat No_exist.txt 2> tt.txt

这时在tt.txt文件中就会出现标准错误“cat: No_exist.txt: No such file or directory”。

一样的道理,咱们能够将标准错误重导向输出为标准输出,2>&1

好比

$ cat No_exist.txt

cat: No_exist.txt: No such file or directory

$ cat No_exist.txt 2>&1

cat: No_exist.txt: No such file or directory

虽然它们在终端上输出的内容看起来没有什么区别,可是它们的身份是不同的,第一个是以标准错误的形式输出的,而第二个是标准输出。咱们能够经过管道符号验证一下它们的不一样。

$ cat No_exist.txt | sed 's/or/and/'

cat: No_exist.txt: No such file or directory

$ cat No_exist.txt 2>&1| sed 's/or/and/'

cat: No_exist.txt: No such file and directory

如今能够看出区别了,第一个标准错误没法经过管道符号把“or”替换成“and”,而第二个是标准输出,能够经过管道符号,把其中的“or”替换成“and”.

一样的道理,也能够将标准输出重导向为标准错误“1 >2&“

那么回过头来,看最开始的那个问题,为何nohup同时会运算结果和运算过程的描述输出到同一个sam文件中呢?

为了简便,用下面的代码(example.sh)重现了nohup中的错误。

#!/bin/bash

echo "this is outcome!"

sleep 1

echo "sleep for 1s" >&2

echo "this is outcome, too!"

sleep 2

echo "second sleep for 2s" >&2

其中sleep的过程描述经过 >&2以标准错误的形式出现,而outcome则以标准输出的形式输出。

正常状况下,运行:

$ ./example.sh > outcome.txt

sleep for 1s

second sleep for 2s

$ cat outcome.txt

this is outcome!

this is outcome, too!

标准错误直接输出到了终端中,运行结果输出到了outcome.txt中,没有任何问题。可是在nohup的状况下,这种状况就变了。

在nohup的说明中,提到“若是标准输出是在终端,那么输出的内容将会被添加到‘nohup.out’文件中;若是标准错误的输出是在终端,那么内容将会被重导向到标准输出“。这就意味着,在没有特殊说明的状况下,标准输出和标准错误将会被重导向输出到同一个地方。以下,

$ nohup ./example.sh

appending output to nohup.out

$ cat nohup.out

this is outcome!

sleep for 1s

this is outcome, too!

second sleep for 2s

在nohup.txt文件中不只出现了我想要的运行结果,还出现了我不想要的运行过程!这也就解释了为何在个人sam文件中会出现不少本不该该属于该文件的内容。

既然知道了缘由,那么解决问题就不难了。咱们能够经过重导向输出,把运行结果和运行过程分别输出到不一样的文件中。

$ nohup ./example.sh 2>stderr.log 1>outcome.txt

$ cat stderr.log

sleep for 1s

second sleep for 2s

$ cat outcome.txt

this is outcome!

this is outcome, too!

这样,将过程以标准错误形式输出到stderr.log中,将结果以标准输出形式输出到outcome.txt中。

因此本文最开头提到的命令能够改成:

nohup bwa mem ref.fa read1.fq.gz read2.fq.gz 1> read12.sam 2>read12.log &

总结

nohup在默认条件下,标准错误和标准输出会重导向到同一个文件中;经过文件描述符(0,1,2)来对控制输出内容;养成良好的输出控制习惯,对标准输出和标准错误要区别对待。

===== THE END =====

参考资料:

默认标准错误文件linux,Linux中标准输出和标准错误的重导向相关推荐

  1. python开发应用程序错误怎么办_编程中遇到的Python错误和解决方法汇总整理

    开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习. 知识在于积累嘛!微笑 +++++++++++++++++++++++++++++++++ ...

  2. python库文档的错误_自己编程中遇到的Python错误和解决方法汇总整理

    开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习. 知识在于积累嘛!微笑 +++++++++++++++++++++++++++++++++ ...

  3. 教你把文件的文件名中繁体中文翻译成简体中文重命名

    文件重命名是我们常遇到的问题,而且一些文件的文件名中有些文字是繁体中文,那么如何将其翻译成简体中文重命名?下面就来试试这个新技巧吧.一起看操作. 准备工具: 一台WIN电脑 文件 开始操作: 在电脑浏 ...

  4. Linux内核机制总结内存管理之用户页错误文件描述符(二十八)

    文章目录 1 用户页错误文件描述符 1.1 使用方法 1.2 技术原理 重要:本系列文章内容摘自<Linux内核深度解析>基于ARM64架构的Linux4.x内核一书,作者余华兵.系列文章 ...

  5. linux ftp登录530错误,Linux系统中用ftp连接530错误怎么办

    在前面的文章中我们曾向大家介绍了Win7系统下读卡器盘符不见了的解决办法,不知道大家觉得怎么样呢!现在我们要向大家介绍的就是Linux系统中ftp连接530错误怎么办!下面大家还是跟着我们5636网吧 ...

  6. linux nohup参数,如何在 Linux 系统中使用 nohup 命令

    nohup命令用来执行另一个指定为参数的命令,并忽略所有SIGHUP挂起)信号.SIGHUP是当进程的控制终端关闭时发送到进程的信号. 通常,当您在 SSH 上运行命令时,如果连接断开,或者您注销 S ...

  7. 文件大于50M的上传到阿里云的OSS时浏览器中会出现如下错误提示:Failed to load resource: net::ERR_CONNECTION_RESET解决

    近期做文件上传到阿里云的OSS时,开始上传小文件没有任何问题,后来无意间上传了一些大于50M的文件, 浏览器中会出现如下错误提示:Failed to load resource: net::ERR_C ...

  8. nohup后台运行以及重定向标准输出和标准异常

    nohup 加&是后台运行并把stdout输出到文件nohup.out中.其实&是后台运行的命令. 一般都是在linux下nohup格式: nohup command_line 或者 ...

  9. linux Linux常见特殊符号 重定向符号

    Linux中高级I/O 重定向的符号及其用法 符号 意义 n>&m 将FD为m的输出复制到FD为n的文件中 n<&m 将FD为m的输入复制到FD为n的文件中 n>&a ...

最新文章

  1. python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍
  2. 计算机应用基础2010一级,2010年一级结构基础辅导:(计算机应用基础)备考讲义(10)...
  3. [PAT乙级]1018 锤子剪刀布
  4. slope one matlab代码,经典推荐算法之 Slope one
  5. 绝不要在构造函数和析构过程中调用virtual函数
  6. vmware 多外网ip
  7. via浏览器原始css,简约却不简单—via浏览器
  8. win10街头篮球服务器维护中,win10系统玩街头篮球游戏延迟不顺畅的处理技巧
  9. command/cmd命令大全
  10. php最大的论坛,phpwind论坛史上最大漏洞 -电脑资料
  11. java大话西游单机版,【大话西游】手工架设服务端+双客户端+加密解密全套工具...
  12. 像素画,治愈系超萌!看了这个,我都心痒了
  13. 28、利用稳压芯片设计一个恒流源
  14. cefsharp内嵌资源html的读取,C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源...
  15. 开启Fluter基础之旅三-------Material Design风格组件、Cupertino风格组件、Flutter页面布局篇...
  16. 考研计算机最低分数,考研最低录取分数线是多少
  17. 定位追踪器百科:宠物、老人、小孩、汽车通用的定位器
  18. 【goldengate】官方文档笔记三 Oracle GoldenGate 实时报表
  19. 在html 源代码消除消除当前页面的脚本发生错误,当前页面的脚本发生错误
  20. 第一次参加csdn活动

热门文章

  1. nand ubi -2 ubi管理下的SLC nand
  2. New Linux2.6 I2C Driver Model Example
  3. 四大科技巨头跟随者众 智能家居市场容量可观
  4. 【规范】前端编码规范——css 规范
  5. 配置redis自启动脚本
  6. 次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102
  7. Windows Phone 7 MVVM模式数据绑定和传递参数
  8. 快速入门 TensorFlow2 模型部署
  9. 赵丽颖固然漂亮,可这份Hadoop核心教程也不差呀
  10. linux png pdf,将多页PDF转换为PNG并返回(Linux)