Linux命令行输出


我们在一些Linux下的shell脚本中经常会碰到nohup command >/dev/null 2>&1 &这样形式的命令>我们在一些Linux下的shell脚本中经常会碰到nohup command >/dev/null 2>&1 &这样形式的命令。
那么这条命令应该怎么理解呢?首先我们对这条命令进行拆分:

nohup和&后台运行

nohup

  1. 用途:no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
  2. 语法:nohup command [arg] [&]
  3. 在默认情况下(非重定向时),会输出一个名叫nohup.out的文件到当前目录下,如果当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中。

&

  1. 用途:使程序在后台运行,退出终端退出后命令仍旧执行。

综合起来看就是
使用&后台运行程序:
结果会输出到终端
使用Ctrl + C发送SIGINT信号,程序免疫
关闭session发送SIGHUP信号,程序关闭


使用nohup运行程序:
结果默认会输出到nohup.out
使用Ctrl + C发送SIGINT信号,程序关闭
关闭session发送SIGHUP信号,程序免疫


平日线上经常使用nohup和&配合来启动程序> nohup ./test &:
同时免疫SIGINT和SIGHUP信号

终止后台程序

  1. 终端未关闭
    jobs -l该命令可以带进程号显示作业列表,之后kill pid即可
  2. 终端已关闭
    在终端关闭后,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,必须写在最后,否则会失去原有意义

文章作者: Secgxx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Secgxx !
  目录