我们在一些Linux下的shell脚本中经常会碰到
nohup command >/dev/null 2>&1 &
这样形式的命令>我们在一些Linux下的shell脚本中经常会碰到nohup command >/dev/null 2>&1 &
这样形式的命令。
那么这条命令应该怎么理解呢?首先我们对这条命令进行拆分:
nohup和&后台运行
nohup
- 用途:no hang up(不挂起),用于在系统后台不挂断地运行命令,
退出终端
不会影响程序的运行。 - 语法:nohup command [arg] [&]
- 在默认情况下(非重定向时),会输出一个名叫
nohup.out
的文件到当前目录下,如果当前目录的nohup.out
文件不可写,输出重定向到$HOME/nohup.out
文件中。
&
- 用途:使程序在后台运行,退出终端退出后命令仍旧执行。
综合起来看就是
使用&后台运行程序:
结果会输出到终端
使用Ctrl + C发送SIGINT信号,程序免疫
关闭session发送SIGHUP信号,程序关闭
使用nohup运行程序:
结果默认会输出到nohup.out
使用Ctrl + C发送SIGINT信号,程序关闭
关闭session发送SIGHUP信号,程序免疫
平日线上经常使用nohup和&配合来启动程序> nohup ./test &:
同时免疫SIGINT和SIGHUP信号
终止后台程序
- 终端未关闭
jobs -l
该命令可以带进程号显示作业列表,之后kill pid
即可 - 终端已关闭
在终端关闭后,jobs
就无法显示作业列表了,这个时候就只能通过ps -ef
在进程列表里查找
几个基本符号及其含义
- /dev/null 表示空设备文件,也就是输出到一个“黑洞”里,最终不会获取输出
- 0 表示stdin标准输入
- 1 表示stout标准输出
- 2 表示sterr标准错误
- & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
从
command >/dev/null
来看,这其实一个缩写的命令,对于一个重定向的命令,肯定是command >a
这种形式,它默认等于command 1 >a
,即将标准输出结果重定向到文件a中,
通过上面command > /dev/null等价于command 1 > /dev/null,那么对于2>&1也就好理解了,2就是标准错误,1是标准输出,那么这条命令不就是相当于把标准错误重定向到标准输出么。但是是&1而不是1,这里&是什么?这里&相当于等效于标准输出。
- 2>&1,意思是错误输出等同于标准输出。所以使得./test.sh >test.log,可以把标准输出和错误输出全部导入日志test.log里。
- 注意:2>&1,中间不能有空格。
- 注意:2>&1,必须写在最后,否则会失去原有意义