通常我们在启动SpringBoot项目的的jar包时,会使用以下命令
nohup java -jar xxxx.jar >log.log 2>&1 &
整条命令由linux中的bash进行解释执行,一般我们在执行某些应用程序时会使用 nohup command & 如:
nohup python3 xxx.py &
nohup java -jar xxx.jar &
1.nohup
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
2.&
用途:在后台运行
再来看
java -jar xxx.jar
如果我们使用上面的命令直接启动jar包,会在屏幕直接打印启动的信息及程序内的输入输出信息,如下
并且直接使用Ctrl + C 会中止程序的运行
再结合nohup及& 使用
nohup java -jar xxx.jar &
会将原本在屏幕直接打印的内容重定向到nohup.out 的文件中。
3.重定向
在linux系统中一切皆文件,就是说java -jar 也是一个文件,是文件就会有文件描述符FD,在liunx中每个文件都有3个固定的文件描述符0,1,2
其中0 可以理解为Java中的System.in;1可以理解为Java中的System.out ;2可以假定为一个System.error 即产生错误后的输出流,如图所示
注意图中FD下的 0u 1u 2u 分别指的是我们刚才描述的三种类型的描述符,后面的字母代表当前流的状态有三种u r w ,u代表双向的读写,r代表读,w代表写
1>log.log 2<log.log 2>&1
上面代码中,< 代表输入定向 > 代表输出定向 两种命令符号的左边均是要重定向的类型,中间不能有空格,右边为定位的终止端。比较特殊的是 2>&1是将error输出流重定向到out输出流,且1前面加上&。可以在虚拟机中做如下测试(都是基本的linux常用命令)
4.完整解读
综上我们再看整条的启动命令
nohup java -jar xxxx.jar >log.log 2>&1 &
nohup & 将xxx.jar 以后台运行的方式启动,并将java -jar 产生的输出重定向到log.log文件中。
注意 : > log.log 只是重定向了正常的输出流,我们还要将发生错误的输出流2重定向到正常的输出流1中。