linux环境下启动应用的不同方式对比分析

大家好,我是G探险者。

平时我们在Linux环境下启动Java应用程序时。可能会选择在前台或后台运行它们。但是这两者启动命令的各种参数含义是什么意思呢,今天我们就来聊聊,并分析一下他们的特点。

1. 前台启动

参数:

  • java: Java程序的启动命令。
  • -Xms2G-Xmx2G: 分别设置Java虚拟机(JVM)的初始和最大堆大小为2GB,根据实际需要来设置
  • -XX:+HeapDumpOnOutOfMemoryError: 在内存溢出时生成堆转储文件。
  • -XX:HeapDumpPath: 指定堆转储文件的保存路径。
  • -jar: 表明接下来的参数是一个Jar包。
  • -Dproperty.name=value: 设置系统属性,这里用property.namevalue表示一般性的属性名和值。
  • -Dlog.path: 设置日志文件的存放路径。
  • -Dconfig.path: 指定配置文件的路径。
  • /path/to/app.jar: 应用程序的Jar包位置和名称。
  • --spring.config.location: 指定Spring框架配置文件的位置。
  • --logging.config: 指定日志配置文件的位置。

-D命令详解: 在Java命令行中,-D标志用于设置系统属性,这些属性通常用于配置JVM,Java应用程序或者框架特定的行为。以下是一些常见的系统属性示例:

  • -Djava.library.path=/path/to/libs

    设置查找本地库(如.so.dll)的路径。

  • -Djava.security.policy=somepolicy.policy

    为Java应用程序指定一个安全策略文件。

  • -Duser.timezone=GMT+8

    设置用户的时区。

  • -Dfile.encoding=UTF-8

    设置文件编码格式,这对读写文件时的编码解码非常重要。

  • -Dsun.net.client.defaultConnectTimeout=10000

    设置默认的网络连接超时时间(单位为毫秒)。

  • -Dsun.net.client.defaultReadTimeout=10000

    设置默认的网络读取超时时间(单位为毫秒)。

  • -Duser.country=US -Duser.language=en

    设置用户的国家和语言,这可能会影响到应用程序中的本地化内容。

  • -Dlog4j.configuration=file:/path/to/log4j.properties

    指定log4j日志框架的配置文件路径。

  • -Dspring.profiles.active=production

    设置Spring框架的活动配置文件,此处为production

  • -Djavax.net.ssl.keyStore=/path/to/keystore.jks

    指定Java密钥库的路径,这在使用SSL连接时很有用。

  • -Djavax.net.ssl.keyStorePassword=changeit

    设置访问Java密钥库时的密码。

这些系统属性可以在启动Java应用程序时传递给JVM,从而改变其默认行为或配置特定的参数。根据应用程序的需要,开发人员和系统管理员可以设置和调整各种系统属性。

示例:

shell 复制代码
java -Xms2G -Xmx2G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heap-dump.hprof -jar -Dproperty.name=value -Dlog.path=/path/to/log -Dconfig.path=/path/to/config.properties /path/to/app.jar --spring.config.location=/path/to/application.yml --logging.config=/path/to/logging-config.xml

2. 后台启动

参数:

  • nohup: 用于在关闭终端后继续运行命令。
  • > /dev/null: 将标准输出重定向到/dev/null,即丢弃输出。
  • 2>&1: 将标准错误重定向到标准输出(在这里也是/dev/null)。
  • &: 将命令放入后台执行。

示例:

shell 复制代码
nohup java -Xms2G -Xmx2G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heap-dump.hprof -jar -Dproperty.name=value -Dlog.path=/path/to/log -Dconfig.path=/path/to/config.properties /path/to/app.jar --spring.config.location=/path/to/application.yml --logging.config=/path/to/logging-config.xml > /dev/null 2>&1 &

3. 实时日志查看

通过前台启动的应用,我们可以很容易的查看到实时运行日志,那如果是通过后台命令启动的应用,该如何查看实时运行日志呢?

当你在后台启动一个应用程序时,通常会将输出重定向到一个文件。如果你的命令是这样的:

sh 复制代码
nohup java -jar yourapp.jar > app.log 2>&1 &

在这个例子中,app.log 文件会包含应用程序的标准输出和错误输出。为了实时查看日志,你可以使用 tail 命令,它非常适合于监控实时更新的日志文件。

可以这样使用 tail

tail 是一个在Unix-like操作系统中常用的命令行工具,用于输出文件中的最后部分。默认情况下,它会打印出文件的最后10行,但是你可以通过命令行参数来修改这个行为。 以下是tail命令的一些常见用法和选项:

  • tail [文件名]
    显示指定文件的最后10行内容。
  • tail -n [行数] [文件名]
    显示指定文件的最后N行内容。例如,tail -n 20 file.txt 会显示file.txt的最后20行。
  • tail -f [文件名]
    实时监控指定文件的新增内容。这对于查看实时日志文件特别有用。当文件有新内容写入时,tail 会持续地将新内容输出到终端。
  • tail -F [文件名]
    -f 类似,但是当文件被删除后再重新创建时,tail 会重新打开文件继续监控。
  • tail --pid=[进程号] -f [文件名]
    -f 一起使用,监控日志直到特定的进程终止。
  • tail -c [字节数] [文件名]
    输出文件的最后N个字节。例如,tail -c 100 file.txt 会显示file.txt的最后100个字节。

tail 命令特别适合于那些长时间运行的应用程序,这些程序会持续地向日志文件中写入内容。使用 tail,系统管理员和开发者可以实时查看最新的日志条目,以便监控应用程序的状态或进行故障排除。

sh 复制代码
tail -f app.log

这里的 -f 参数会让 tail 命令持续输出新追加到文件的内容,这样你就可以看到实时的日志输出了。

如果你的应用程序使用了像 log4jlogback 这样的日志框架,并且配置了特定的日志文件,那么你也可以直接使用 tail 来监控那些日志文件。

此外,如果你的系统使用了日志管理工具如 systemd,那么你可能需要使用 journalctl 命令来查看日志。例如,如果你的应用程序作为一个服务启动,你可以这样查看日志:

sh 复制代码
journalctl -u yourservice.service -f

这里的 -u 参数指定服务的名称,-f 同样表示实时跟踪最新的日志条目。

记得替换 app.logyourservice.service 为你的实际日志文件名或服务名。

4.对比分析

这里是一个简化的对比表格,概括了前台和后台启动命令的主要差异和参数含义:

特性/参数 前台启动命令 后台启动命令
命令 java nohup java
初始堆大小 -Xms2G (设置JVM的初始堆大小为2GB) -Xms2G (同前台)
最大堆大小 -Xmx2G (设置JVM的最大堆大小为2GB) -Xmx2G (同前台)
堆转储 -XX:+HeapDumpOnOutOfMemoryError (在内存溢出时生成堆转储文件) -XX:+HeapDumpOnOutOfMemoryError (同前台)
堆转储路径 -XX:HeapDumpPath=/path/to/heap-dump.hprof -XX:HeapDumpPath=/path/to/heap-dump.hprof (同前台)
系统属性 -Dproperty.name=value (通用的系统属性设置) -Dproperty.name=value (同前台)
日志路径 -Dlog.path=/path/to/log -Dlog.path=/path/to/log (同前台)
配置文件路径 -Dconfig.path=/path/to/config.properties -Dconfig.path=/path/to/config.properties (同前台)
应用程序Jar包 /path/to/app.jar /path/to/app.jar (同前台)
Spring配置文件 --spring.config.location=/path/to/application.yml --spring.config.location=/path/to/application.yml (同前台)
日志配置文件 --logging.config=/path/to/logging-config.xml --logging.config=/path/to/logging-config.xml (同前台)
输出重定向 输出显示在终端 > /dev/null (将标准输出重定向到/dev/null, 即丢弃输出)
错误重定向 错误显示在终端 2>&1 (将标准错误重定向到标准输出,这里也就是/dev/null)
后台执行 无 (进程在终端保持活跃) & (将命令放入后台执行)
会话依赖 依赖当前终端会话,终端关闭则程序终止 独立于终端会话,终端关闭后程序继续运行
适用场合 开发和测试环境,需要实时监控输出 生产环境,服务需要长时间运行,不需要实时监控输出

结论

选择前台或后台启动方式取决于应用程序的需求。前台模式适合于开发和测试环境,以便实时监控应用程序的输出和性能。而后台模式则适合于生产环境,可以确保应用程序在用户退出会话后继续运行,无需监视其输出。

相关推荐
bohu834 小时前
亚博microros小车-原生ubuntu支持系列:8-脸部检测与人脸特效
linux·opencv·ubuntu·dlib·microros·亚博
陈平安Java and C4 小时前
MyBatisPlus
java
秋野酱4 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇5 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
Bunny02125 小时前
SpringMVC笔记
java·redis·笔记
架构文摘JGWZ5 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC5 小时前
Swift语言的网络编程
开发语言·后端·golang
feng_blog66885 小时前
【docker-1】快速入门docker
java·docker·eureka
邓熙榆6 小时前
Haskell语言的正则表达式
开发语言·后端·golang
枫叶落雨2227 小时前
04JavaWeb——Maven-SpringBootWeb入门
java·maven