日常开发中常用命令之 nohup 命令

886 阅读4分钟

之前几篇文章分享了异步接口的实现和原理,基本上都是需要查看源码来辅助理解,说实话,看懂之后可能觉得还好,但是在一开始不太清楚的时候阅读源码确实有点枯燥,尤其是在你不是很想去了解这个的时候。只有当我们真正想去了解这个东西的时候可能才会愿意花精力去研究,这时候就不会那么无聊了,反而会觉得在探索的过程中很有趣。

接下来我开始分享稍微轻松一点但又不那么无聊而且很实用的东西,那就是日常中我们肯定会用到很多命令,有一部分是我们用的比较频繁,而且又是必备的命令,这些命令我们需要熟练掌握,这有利于提高我们日常的工作效率。

首先我们要知道所有的命令都是为了帮助我们完成一件或多件事情的,也就是在计算机系统中,我们想要做什么,都需要通过相对应的命令来告诉计算机我们的需求,如果某个命令经常用,也就说明这个命令所做的事情我们经常需要做,下面我们就根据常见需求来引出相对应的命令。

后台启动 SpringBoot 项目:

nohup java -jar usercenter.jar --spring.profiles.active=development > usercenter.log 2>&1 &

作为后台开发人员来说,日常应该经常需要启动项目程序,只不过平常本地都是通过 idea 来启动,如果现在需要将 usercenter 项目打包部署到一台用于开发测试的服务器上,那么这时候我们需要将 usercenter 打包,然后拷贝到服务器上,拷贝上去之后再通过 ssh 命令连接到服务器终端,这里假设服务器都已经是安装好了 Java 的运行时环境。接下来我们就可以启动刚才拷贝上来的 jar 包了。正常前台启动的命令是:

java -jar usercenter.jar --spring.profiles.active=development

但是这种方式是前台启动,日志直接输出到终端,这对于一次性启动的项目那还好,启动完测试好了直接关闭终端断开服务器连接就好,但是如果想要在我们退出终端后让它保持继续运行的话就不行了,因为上面的这种方式在我们退出终端的同时程序也停止运行了。这时候就有必要通过后台启动的方式来让程序保持在后台继续运行,也就是 nohup 命令。

nohup 英文全称是 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

语法格式:nohup Command [ Arg … ] [&] 参数说明: Command:要执行的命令。 Arg:一些参数,可以指定输出文件。 &:让命令在后台执行,终端退出后命令仍旧执行。

上面这一段是菜鸟教程里面对 nohup 命令的介绍,对于上面描述的默认情况下输出一个名叫 nohup.out 的文件到当前目录说的是我们没有将 nohup 命令的输出重定向到其他文件的话会输出到当前目录下一个默认的名叫 nohup.out 的文件中,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

也就是如果以下面的方式执行则会在当前目录下产生一个 nohup.out 的文件。

nohup java -jar usercenter.jar --spring.profiles.active=development &

但如果在当前目录下我们需要启动多个项目的话,项目启动的日志就都输出到 nohup.out 文件中了,不利于我们查看日志,这时候我们可能需要进行日志重定向来区分不同项目的日志输出,这样也有利于我们后期再次登录服务器时通过文件名区分不同项目的日志输出。

于是我们就用到了下面的命令:

nohup java -jar usercenter.jar --spring.profiles.active=development > usercenter.log 2>&1 &

为了帮助更好地理解上面这个命令,我们先了解下关于终端输入输出一个概念:

0< – stdin (standard input,标准输入) ,简写 <
1> – stdout (standard output,标准输出),简写 >
2> – stderr (standard error,标准错误输出) 

对于上面这个命令,中间 java -jar 那一部分自然就是我们要执行的项目启动命令,nohup 以及末尾的 & 表示在后台不挂断的执行 java -jar 命令,即使终端退出后命令仍继续执行,> usercenter.log 表示将命令的标准输出重定向到 usercenter.log 文件,2>&1 表示将标准错误输出也重定向到标准输出中,也就是说命令执行的标准输出和标准错误输出都输入到 usercenter.log 文件中。

当然如果我们不关心命令执行的输出结果,也不想要默认生成的那个 nohup.out 文件,这时候我们可以将输出重定向到 /dev/null,/dev/null 是一个特殊的文件,它接受并丢弃写入其中的所有输入。一般对于那种可能产生大量的日志输出时,这个就比较有用了,避免日志文件占据大量空间。

微信公众号:rookiedev,Java 后台开发,励志终身学习,坚持原创干货输出,你可选择现在就关注我,或者看看历史文章再关注也不迟。长按二维码关注,我们一起努力变得更优秀!