最近因为某些原因,需要自己去服务器部署项目,出于好奇,专门看了下脚本的命令,然后自己测试了一下。
代码准备
首先,是java代码:
public class test{
public static void main(String[] args) throws InterruptedException{
while(true){
System.out.println(1);
Thread.sleep(1000);
}
}
直接运行(不使用nohup 和 &)
然后,运行下面命令,执行该代码:
java test.java
java tes
结果就是打印1,直到手动结束。
java test
1
1
1
1
1
1
^
使用&
执行以下命令:
java test
会先返回:
[1] 2531
然后就开始打印1,在这期间,即使是手动ctrl C,也无法结束:
java test &
[1] 25313
1
1
1
1
1
^C #尝试ctrl C
1
1
1
1
1
^C #尝试ctrl
但如果我们此时关掉这个终端(我是用Xshell连接的,关掉终端指:我关闭这个连接的窗口),这个任务就会结束。
当然,关掉终端太麻烦了,我最后是通过kill -9 25313
结束的。
使用nohup
执行以下命令:
nohup java tes
会出现如下情况:
nohup java test
nohup: ignoring input and appending output to ‘nohup.out
同时,该终端被占用。即:你在这个终端啥也干不了。
同时,因为没有指定输出文件,所以默认输出到当前目录下的nohup.out
。 这时候,关掉终端,任务也会继续运行。
在被占用的终端上,
ctrl C
可以结束。当然,kill -9
也可以。
使用nohup和&
执行如下命令:
nohup java test
执行结果如下:
nohup java test &
[1] 26273
nohup: ignoring input and appending output to ‘nohup.out’
这时候,终端不会被占用,你可以输入其他命令并执行。
这时候,ctrl C
和关掉终端都不会结束该任务。
结论
使用&
1. 如果有输出,仍然会输出到终端。
2. ctrl C
不能结束 3. 但关闭终端,任务就会结束。
4. 终端可以输入其他命令,但如果输出过于频繁,该终端仍无法使用
使用nohup
1. 如果有输出,不会输出到终端,而是输出到文件。
2. 在当前终端,ctrl C
可以结束任务。 3. 关闭终端,任务
不会结束。 4. 终端可以继续使用。
使用nohup 和 &
1. 如果有输出,不会输出到终端,而是输出到文件。 2. 在当前终端,
ctrl C
不能结束任务。 3. 关闭终端,任务
不会结束。 4. 终端可以继续使用。
专业说法
使用Ctrl + C
可以发送SIGINT
信号,关闭session(终端)
发送SIGHUP
信号。
使用&,程序拒绝
SIGINT
信号,接受SIGHUP
信号; 使用nohup,程序接受
SIGINT
信号,拒绝SIGHUP
信号; 使用nohup和&,程序拒绝
SIGINT
信号,拒绝SIGHUP
信号。
| | |
使用& | 拒绝 | 接受 |
使用nohup | 接受 | 拒绝 |
| 使用nphup 和 & | 拒绝 | 拒绝 |