32-Linux命令【nohup】

nohup

  nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
  nohup 是 no hang up 的缩写,就是不挂断的意思。
  nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
  在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。
 

案例

# nohup command > myout.file 2>&1 &   # 执行command命令,将输出重定向到myout.file文件,输出内容不打印到屏幕上
  这里的&没有固定的意思, 放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下:
    0 – stdin (standard input)
    1 – stdout (standard output)
    2 – stderr (standard error) 
  2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到myout.file文件中。
  
  换言之 2>1 代表将stderr重定向到当前路径下文件名为1的file中, 而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射
  
  特殊写法:
1 # 特殊写法1
2 nohup  command  &>file  &
3 # 特殊写法2
4 nohup  command  >&file  &   
5 # &>file和>&file 二者的意思完全相同,都等价于  
6 nohup  command  >file  2>&1  &
 

Linux系统中0 1 2是一个文件描述符:

  标准的输入,输出和错误输出分别表示为STDIN,STDOUT,STDERR,也可以用0,1,2来表示。
  整理成表格如下:

    名称            代码       Linux 下文件描述符(Debian 为例)
    标准输入(stdin)       0       /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0
    标准输出(stdout)      1       /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0
    标准错误输出(stderr)    2       /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0
  其中: 0表示键盘输入 1表示屏幕输出  2表示错误输出。

 
  2>&1的含义:将标准错误输出重定向到标准输出。  
  注意:符号>&是一个整体,不可分开,分开后就不是上述含义了。
 
 

顺序问题

 1 find /etc -name .bashrc > list 2>&1
 2 # 我想问为什么不能调下顺序,比如这样
 3 find /etc -name .bashrc 2>&1 > list
 4 
 5 这个是从左到右有顺序的
 6 # 第一种
 7 # xxx > list 2>&1  # 先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list
 8 
 9 # 第二种
10 # xxx 2>&1 > list  # 先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响
11 
12 # 对于上面 '2>&1',举个例子,比如说:
13 $ find /etc -names "*.txt"  >list 2>&1  # 从左往右执行,执行到 >list,此时的 stdout 为 list;而执行到 2>&1,表示 stderr 重定向到 stdout,这里也就是 list 文件。
14 
15 # 因为 [ find /etc -names "*.txt" ] 这条命令是错误的( -names 应该是 -name)。
16 # 本来要输出到终端屏幕的错误信息:  find: unknown predicate `-names`
17 # 被重定向到了 stdout 也就是 list 文件中,所以屏幕不会出现错误信息,而是打印到了 list 文件中。

 

 

nohup和&的区别:

& :    指在后台运行
nohup : 不挂断的运行,注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
 
  &是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出,那么,我们可以巧妙的吧他们结合起来用就是
nohup COMMAND &  # 这样就能使命令永久的在后台执行

 

例如:

1. sh test.sh &  
  将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失(缺少的日志的输出)
  将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止。
2. nohup sh test.sh  
将sh test.sh任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。
3. nohup sh test.sh  & 
将sh test.sh任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。

 

 

posted @ 2021-03-09 14:37  为你编程  阅读(140)  评论(0编辑  收藏  举报