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)
后台执行 无 (进程在终端保持活跃) & (将命令放入后台执行)
会话依赖 依赖当前终端会话,终端关闭则程序终止 独立于终端会话,终端关闭后程序继续运行
适用场合 开发和测试环境,需要实时监控输出 生产环境,服务需要长时间运行,不需要实时监控输出

结论

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

相关推荐
V+zmm1013421 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
雨中rain22 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
Bessssss41 分钟前
centos日志管理,xiao整理
linux·运维·centos
s_yellowfish41 分钟前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
豆是浪个43 分钟前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&44 分钟前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我一定会有钱1 小时前
【linux】NFS实验
linux·服务器
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13141 小时前
常用的缓存技术都有哪些
java
Ven%1 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip