最近因为某些原因,需要自己去服务器部署项目,出于好奇,专门看了下脚本的命令,然后自己测试了一下。


代码准备

      首先,是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​​信号。


​SIGINT​

​SIGHUP​

使用&

拒绝

接受

使用nohup

接受

拒绝

| 使用nphup 和 & | 拒绝 | 拒绝 |