nohup
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
- 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
- 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
- 如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
退出状态:该命令返回下列出口值:
- 126 可以查找但不能调用 Command 参数指定的命令。
- 127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
&
用途:在后台运行
一般两个一起用1
nohup command &
例如1
nohup command > myout.file 2>&1
在上面的例子中,输出被重定向到myout.file文件中。
nohup与&的区别:
nohup只是让命令忽略SIGHUP命令而已;&则让命令在后台运行,至于该命令是否能在脱离终端后继续执行则要看进程是否是守护进程,如果不是,则需要nohup来帮忙。
查看某个端口的进程
1 | lsof -i:80 |
结果:1
2
3COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 27295 root 19u IPv4 527052 0t0 TCP *:http (LISTEN)
node 27295 root 24u IPv4 528732 0t0 TCP ubuntu:http->xxx.xxx.xxx.xxx:50367 (ESTABLISHED)
终止后台运行的进程
1 | kill -9 PID |
pid为进程号。
nohup不产生日志
1 | nohup java -jar item-2.0.1-SNAPSHOT.jar 2 >error.log & |
0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。
在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将program.sh的错误信息输出到log文件中:1
./program.sh 2>log
这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。
另外,也可以实现0,1,2之间的重定向。
2>&1:将错误信息重定向到标准输出。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如:1
ls 1>/dev/null 2>/dev/null
这样不会有任何输出。1
lsss 1>/dev/null
因为lsss不是一条合法命令,但是使用的是1(标准输入),所以还是会报错;1
lsss 2>/dev/null
使用2(标准错误信息输出),输出的错误会被吞掉,所以不会有任何输出;1
ls 1>/dev/null
ls是标准命令,但是使用1吞掉了标准输出,所以不会有任何输出。
还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如:1
ls >/dev/null 2>&1
注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,于是一切静悄悄:-)
由于使用nohup时,会自动将输出写入nohup.out文件中,如果文件很大的话,nohup.out就会不停的增大,这是我们不希望看到的,因此,可以利用/dev/null来解决这个问题。
1 | nohup ./program.sh >/dev/null 2>log & |
这样在跑程序的时候,只将错误信息输出到log文件中。
如果什么信息都不要,使用1
nohup ./program.sh >/dev/null 2>&1 &
(好像没用?)
使用nohup失效原因
用putty连接ubuntu,要执行一个后台命令
正常用nohup直接运行命令,就可以在后台运行
nohup ./1.sh &
但关闭putty后,发现命令也停止了
问题出在,直接点putty的右上角X关闭按钮,nohup也会停止
解决:直接在putty中输入exit退出即可