举个例子:我这里有一个xxx.jar包需要运行,如果写成这样
java -jar xxx.jar
那么此时,这个shell将会被占用,无法再做其他操作。
此时只要ctrl+c中断,也就意味着这个程序也中断了,这很不好。
&
这时,我们可以这样
java -jar xxx.jar &
加了&之后,你会发现,程序居然已经在后台运行了,如果你的程序有输出,那么输出的内容会直接显示在shell中,不用惊慌,按下回车键,你就又可以正常输入命令了
运行过程中的输出内容会直接显示再屏幕上,并不会保存
但有的时候我们需要将输出信息保存,以便于后期可以查看,那么我们便可以这样
java -jar xxx.jar >> ./log.txt &
此时,它的输出内容便会保存到当前目录下面的log.txt文件中
> 表示覆盖写入
>> 表示追加写入
上面的操作,按理说已经满足了我们的需求(即程序可以后台运行,日志也可以保存)
但是&有一个致命的缺点,当你关掉shell之后,那你通过&这种方式运行的程序会立马结束
有没有办法,当我关掉shell终端之后,程序也还是可以继续运行的方法呢?肯定有,没有我就不会说了
nohup or screen ?
我推荐使用screen:(原因:喜欢,所以就用咯)
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
简而言之:
远程服务器的时候,断网或者手误关掉了远程终端,会导致会话中断,程序终止。而Screen连接的终端,会话独立运行,程序会一直进行。而且会话可以恢复,还可以自行删除。
安装配置
安装
yum install screen -y
参数说明:
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s <shell> 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
创建screen终端
screen -R yourname
(换成中文理解时新建一个yourname的新窗口 建议名字更换成其它名字)
执行完之后,会发现当前窗口会变成一个screen窗口,在这里就可以运行我们的程序了
这个窗口是独立运行的,程序会一直进行
比如我还是要运行上面的xxx.jar,那么我可以这样
java -jar xxx.jar >> ./log.txt &
程序运行完你会发现和之前好像没有两样。别急,接着看
离开screen
按下ctrl+a+d
,此时我们又回到了以前的shell终端里面,接着关闭shell
然后访问我们的程序,它居然还在运行,发生了什么?
打开shell,输入screen -ls
,会发现我们刚刚创建的yourname,
进入yourname
screen -R yourname
又回到了screen终端。。。
此时,你应该已经明白,创建的screen窗口是一个独立的,不中断的,这句话的含义。
如何结束它呢?
使用screen -ls
,会显示所有的会话,每个会话前面都有相应的进程号。因此,直接
kill -9 进程号