目录

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)信号,语法如下:

1
nohup Command [ Arg ... ] [ & ]

&

& 的意思是在后台运行,即当你在执行 ./start.sh & 的时候,即使你用ctrl C,那么start.sh照样运行(因为对SIGINT信号免疫)。但是要注意,如果你直接关掉shell后,那么,start.sh进程同样消失。可见,& 的后台并不硬(因为对SIGHUP信号不免疫)。

nohup和&的区别

  1. 使用 & 后台运行程序:结果会输出到终端

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

    • 使用Ctrl + C发送SIGINT信号,程序关闭
    • 关闭session发送SIGHUP信号,程序免疫
  3. 平日线上使用 nohup& 配合来启动程序:

    • 同时免疫SIGINTSIGHUP信号

nohup重定向日志文件

nohup 命令还可以将该作业所有输出都被重定向到一个文件中。

例如:

1
nohup java -jar test.jar > test.log 2>&1 &

基本含义:

  • /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(标准输出重定向到文件,错误重定向到标准输出)。