nohup和&命令详解
nohup
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out
的文件到当前目录下,如果当前目录的 nohup.out
文件不可写,输出重定向到 $HOME/nohup.out
文件中。
nohup的意思是忽略SIGHUP信号,所以当运行nohup ./start.sh
的时候,关闭shell,那么start.sh进程还是存在的(对SIGHUP信号免疫)。但是,要注意,如果你直接在shell中用Ctrl C, 那么start.sh进程也是会消失的(因为对SIGINT信号不免疫)。
nohup运行由 Command
参数和任何相关的 Arg
参数指定的命令,忽略所有挂断(SIGHUP)信号,语法如下:
|
|
&
& 的意思是在后台运行,即当你在执行 ./start.sh &
的时候,即使你用ctrl C,那么start.sh照样运行(因为对SIGINT信号免疫)。但是要注意,如果你直接关掉shell后,那么,start.sh进程同样消失。可见,& 的后台并不硬(因为对SIGHUP信号不免疫)。
nohup和&的区别
-
使用 & 后台运行程序:结果会输出到终端
- 使用Ctrl + C发送SIGINT信号,程序免疫
- 关闭session发送SIGHUP信号,程序关闭
-
使用 nohup 运行程序:结果默认会输出到
nohup.out
- 使用Ctrl + C发送SIGINT信号,程序关闭
- 关闭session发送SIGHUP信号,程序免疫
-
平日线上使用 nohup 和 & 配合来启动程序:
- 同时免疫SIGINT和SIGHUP信号
nohup重定向日志文件
nohup 命令还可以将该作业所有输出都被重定向到一个文件中。
例如:
|
|
基本含义:
-
/dev/null
表示空设备文件注:(
/dev/null
属于字符特殊文件,它属于空设备,是一个特殊的设备文件,它会丢弃一切写入其中的数据,写入它的内容都会永远丢失,而且没有任何可以读取的内容。所以我们一般会把/dev/null当成一个垃圾站,不要的东西丢进去。比如来清除文件中的内容。) -
0 表示stdin标准输入
-
1 表示stdout标准输出
-
2 表示stderr标准错误
样例说明:
> file
表示将标准输出输出到file中,也就相当于1>file
2> error
表示将错误输出到error文件中2>&1
表示将错误重定向到标准输出上2>&1 >file
表示将错误和标准输出都重定向到文件file,等于> file 2>&1
(标准输出重定向到文件,错误重定向到标准输出)。