nohup COMMAND >/dev/null 2>&1 &
nohup(no hang up):
表示不挂断,关闭命令行终端进程也将保持运行状态,但如果按Ctrl+C仍会将进程杀死。一般配合&符号一起使用。如nohup command &。
表示将信息重定向输出。 >file 表示将标准输出输出到file中 /dev/null 表示空设备文件。>/dev/null 相当于把所有标准输出和标准出错都扔到垃圾桶里面
0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误
关于2>&1的含义
含义:将标准错误输出重定向到标准输出 符号>&是一个整体,不可分开,分开后就不是上述含义了。2>1的写法其实是将标准错误输出重定向到名为"1"的文件里去了 当使用nohup command &运行以后,标准错误都输出到2去了,console上看不到输出的错误。因此,2>&1,起到了一个重定向的作用,将标准错误重定向到标准输出上去,后台运行的程序就可以在屏幕上看到程序输出的错误了。
& 放在命令结尾,表示后台运行,防止终端一直被某个进程占用,这样终端可以执行别的任务。即:按Ctrl+C不会杀死进程,但关掉终端会杀死进程。一般配合nohup一起使用。
先解释一下nohup的命令:
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
带&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上);
之后解释这个:
为什么2>&1要放在后面
考虑如下一条shell命令
nohup java -jar app.jar >log.txt 2>&1 &
(最后一个&表示把条命令放到后台执行,不是本文重点,不懂的可以自行Google)
为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?
我们不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:
本来1----->屏幕 (1指向屏幕)
执行>log后, 1----->log (1指向log)
执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)