nohup /dev/null 2>&1 含义详解

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

该命令的一般形式为:nohup command &

ls xxx 1>out.txt 2>&1
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &
对 于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0 表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
command >out.file 2>&1 &
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

你可以用
ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。


为何2>&1要写在后面?
command > file 2>&1 
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。 
command 2>&1 >file 
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

用strace可以看到: 
1. command > file 2>&1 
这个命令中实现重定向的关键系统调用序列是: 
open(file) == 3 
dup2(3,1) 
dup2(1,2) 

2. command 2>&1 >file 
这个命令中实现重定向的关键系统调用序列是: 
dup2(1,2) 
open(file) == 3 
dup2(3,1) 

为什么要用 /dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.下面我就为大家来说一下, command > file 2>file   与command > file 2>&1 有什么不同的地方.
首先~command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command   > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道.
command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法.

在Linux系统中,nohup命令与/dev/null2>&1的组合使用是一种常见的技巧,用于确保即使关闭了终端,运行在终端的后台进程仍能持续运行且不会因为终端的关闭而终止。具体步骤如下: 参考资源链接:[nohup /dev/null 2>&1详解:输出重定向与后台执行](https://wenku.csdn.net/doc/6401ac4acce7214c316eb501?spm=1055.2569.3001.10343) 1. 打开终端(命令行界面)。 2. 输入命令,并在其后添加`&`以使命令在后台运行。例如,如果你想要运行一个名为`your_command`的脚本或程序,你可以输入`your_command &`。 3. 为了确保标准输出(STDOUT)和标准错误(STDERR)都被重定向到/dev/null,防止它们显示在终端上,你应该使用`nohup`命令结合`2>&1`。完整的命令应该是`nohup your_command > /dev/null 2>&1 &`。 这里,`nohup`是告诉shell忽略挂断信号,允许进程在终端关闭后继续运行。`your_command > /dev/null`部分将标准输出重定向到/dev/null,意味着所有的正常输出都将被丢弃。`2>&1`是将标准错误重定向到标准输出的位置,由于标准输出已经被重定向到了/dev/null,因此标准错误也会被丢弃,这样既隐藏了正常输出也隐藏了错误信息。 4. 如果你需要记录输出,可以将它们重定向到一个文件中,例如`nohup your_command > output.log 2>&1 &`,这样所有的输出和错误信息都会被写入`output.log`文件中。 通过上述步骤,你可以确保你的后台进程在关闭终端后仍能继续运行,同时不会在终端中显示任何输出或错误信息,这对于管理后台服务和长时间运行的脚本非常有用。为了更深入理解nohup和输出重定向的原理及应用,建议详细阅读《nohup /dev/null 2>&1详解:输出重定向与后台执行》这篇资料。 参考资源链接:[nohup /dev/null 2>&1详解:输出重定向与后台执行](https://wenku.csdn.net/doc/6401ac4acce7214c316eb501?spm=1055.2569.3001.10343)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值