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依然继续运行。