好的,我们来详细解析这个在 Linux/Unix 系统中非常经典的后台启动 Java 应用的命令。

命令全貌

nohup java -jar your-app.jar > nohup.log 2>&1 &

这个命令由多个部分组成,我们可以将它拆解成几个关键片段来理解:

  1. java -jar your-app.jar

  2. > nohup.log

  3. 2>&1

  4. &

  5. nohup


分步详解

1. java -jar your-app.jar

这是命令的核心。

  • java: 调用 Java 虚拟机(JVM)。

  • -jar: 告诉 JVM 接下来要运行的是一个打包成 JAR 格式的可执行程序。

  • your-app.jar: 你要运行的 Java 应用程序的 JAR 包文件名。在实际使用时,你需要将其替换为你的实际 jar 包名,例如 my-springboot-app.jar

2. > nohup.log

这是 ​输出重定向​ 的一部分。

  • >: 重定向操作符。它将命令的 ​标准输出(STDOUT)​​ 重定向到一个文件,而不是默认的输出设备(终端屏幕)。

  • nohup.log: 指定的输出文件名。所有原本要打印到屏幕上的正常输出信息都会被写入到这个文件中。如果文件不存在,它会自动创建;如果已存在,默认会覆盖原有内容(如果希望追加,应使用 >>)。

3. 2>&1

这是 ​错误重定向,也是命令中最容易困惑的部分。

  • 2: 代表 ​标准错误(STDERR)​​ 的文件描述符。在 Linux 中,文件描述符 1是 STDOUT,文件描述符 2是 STDERR。

  • &1: &表示“引用”,&1就是引用文件描述符 1的当前目标。因为上一步已经把 1(STDOUT) 重定向到了 nohup.log文件,所以此时 &1就代表 nohup.log文件。

  • 2>&1的整体意思是:​将标准错误(2) 重定向到(>) 标准输出(1) 当前所指向的同一个地方(即 nohup.log 文件)​

为什么需要它?​

如果不加 2>&1,那么只有正常的输出信息会进入 nohup.log,而错误信息仍然会输出到终端屏幕上。当你关闭终端后,这些错误信息就会丢失,给故障排查带来巨大困难。加上它之后,​正常日志和错误日志都会被完整地记录到同一个文件中

4. &

这是 ​后台运行​ 符号。

  • 它告诉 shell 将这个命令放入后台执行。这意味着命令启动后,终端会立即释放,并返回命令提示符给你,你可以继续输入其他命令,而不需要等待这个 Java 程序运行结束。

5. nohup

nohup​ 是 ​no hang up​ 的缩写。

  • 它的作用是让命令忽略 SIGHUP(挂起)信号。在 Linux 中,当你关闭终端窗口或退出 SSH 登录会话时,系统会向该终端关联的所有进程发送 SIGHUP信号,默认行为是终止这些进程。

  • 使用 nohup包装的命令,可以免疫这种终止行为,即使启动它的终端被关闭,进程也会继续在后台运行。


整体工作流程与逻辑

现在我们把所有部分组合起来,看看这个命令是如何执行的:

  1. 免疫挂起​:nohup开始接管后续的命令,使其免受终端关闭的影响。

  2. 执行程序​:nohup启动 java -jar your-app.jar这个 Java 应用程序。

  3. 重定向输出​:

    • > nohup.log首先将进程的 ​标准输出(STDOUT,文件描述符1)​​ 从屏幕重定向到 nohup.log文件。

    • 2>&1然后将 ​标准错误(STDERR,文件描述符2)​​ 也重定向到 ​当前 STDOUT 所在的地方,也就是 nohup.log文件。

  4. 放入后台​:最后的 &符号将整个被 nohup包裹的进程组放入后台运行。

  5. 结果​:Java 应用在后台启动,所有输出(正常和错误)都记录到 nohup.log文件中,并且即使你关闭了终端,应用也不会停止。

常用后续操作

  • 查看实时日志​:

    tail -f nohup.log

    Ctrl + C退出跟踪模式。

  • 查找进程​(检查是否在运行):

    ps -ef | grep java
  • 停止应用​:

    1. 先用 ps -ef | grep java找到进程 ID(PID)。

    2. 然后使用 kill [PID]来优雅地停止进程。

    3. 如果无效,可以使用 kill -9 [PID]强制终止(不推荐首选)。

总结

命令部分

功能说明

重要性

java -jar your-app.jar

核心命令​:启动Java应用

必需

nohup

免疫挂断​:使进程在终端关闭后仍存活

对于后台服务必需

> nohup.log

记录日志​:将标准输出保存到文件

强烈推荐

2>&1

捕获错误​:将错误信息也重定向到日志文件

极其重要,用于故障诊断

&

后台运行​:不阻塞当前终端

方便操作

这个组合命令是 Linux 运维和开发人员部署后台服务的基石命令之一,理解了它对你管理服务器进程大有裨益。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐