nohup java -jar -Xms150m -Xmx300m -XX:MetaspaceSize=1024M -XX:MaxMetaspaceSize=2048M overhaul.jar >/dev/null 2>&1 &。
这条命令的意思是启动一个 Java 程序,并将程序运行的输出(包括错误信息)完全丢弃,程序会在后台运行。详细解释如下:
命令结构:
nohup java -jar -Xms150m -Xmx300m -XX:MetaspaceSize=1024M -XX:MaxMetaspaceSize=2048M overhaul.jar >/dev/null 2>&1 &
各部分含义:
-
nohup
:nohup
是 "no hang up" 的缩写。它会使命令在后台运行,并且即使当前终端会话被关闭,程序也不会被终止。常用于在远程服务器上运行长时间运行的程序,确保它在会话断开后仍然执行。
-
java -jar
:java
是 Java 虚拟机(JVM)的启动命令。-jar
指定要运行一个 JAR 文件,即overhaul.jar
。
-
-Xms150m
:-Xms
指定 JVM 的初始堆内存大小为 150MB。这意味着程序启动时会分配 150MB 的内存用于堆空间。
-
-Xmx300m
:-Xmx
指定 JVM 的最大堆内存大小为 300MB。这是 JVM 可以使用的最大内存量,超过这个值,JVM 会进行垃圾回收。
-
-XX:MetaspaceSize=1024M
:-XX:MetaspaceSize
设置 JVM 内存中用于存储类元数据的初始大小为 1024MB(1GB)。Metaspace 是 Java 8 以后用于替代永久代(PermGen)来存放类的元数据。
-
-XX:MaxMetaspaceSize=2048M
:-XX:MaxMetaspaceSize
设置 JVM 的 Metaspace 区域的最大内存为 2048MB(2GB)。如果 Metaspace 内存超过这个大小,JVM 会抛出OutOfMemoryError
。
-
overhaul.jar
:- 这是要启动的 JAR 文件,即 Java 应用程序的入口文件。程序将在这个文件中执行。
-
>/dev/null 2>&1
:- 这是输出重定向的部分,指示将程序的所有输出丢弃。
>/dev/null
:将标准输出(stdout)重定向到/dev/null
,这是一个特殊的设备文件,它丢弃任何写入它的数据,相当于 "黑洞"。2>&1
:将标准错误(stderr)重定向到标准输出(stdout),也就是/dev/null
,这意味着错误信息也会被丢弃。2
代表标准错误流,1
代表标准输出流,&1
表示将标准错误流重定向到标准输出流。这意味着所有的错误信息和普通输出信息都会被写入到同一个文件
- 这是输出重定向的部分,指示将程序的所有输出丢弃。
-
&
:&
将命令放入后台执行。这意味着你在终端中运行命令后,程序会在后台继续执行,而不会占用当前终端会话。
总结:
这条命令的作用是:
- 使用
nohup
启动一个 Java 程序(overhaul.jar
),确保即使终端会话关闭,程序也能继续运行。 - 设置 JVM 的内存参数(初始堆内存为 150MB,最大堆内存为 300MB,Metaspace 初始大小为 1GB,最大 Metaspace 大小为 2GB)。
- 将程序的所有输出(标准输出和标准错误)重定向到
/dev/null
,即丢弃所有日志信息。 - 将程序放在后台执行,终端会话关闭后程序依然继续运行。
为什么有意思:
这条命令有几个有意思的地方:
-
日志丢弃:
- 通常来说,运行 Java 程序时会将日志输出到文件中,以便后续查看。但是这里所有的输出(包括标准输出和错误输出)都被丢弃了(
>/dev/null 2>&1
)。这意味着你根本不会获得程序运行的任何反馈,除非它抛出了严重的错误或异常(如OutOfMemoryError
),这类错误会导致程序崩溃。
- 通常来说,运行 Java 程序时会将日志输出到文件中,以便后续查看。但是这里所有的输出(包括标准输出和错误输出)都被丢弃了(
-
后台运行:
- 程序在后台运行,用户可以继续执行其他任务,而不需要等待 Java 程序的完成。这通常用于在服务器上运行长期任务(例如处理数据、定时任务等)。
-
内存配置:
- JVM 的内存配置(堆内存和 Metaspace 内存)设定得相对较大,可能是为了应对高内存需求的应用,或者为了防止由于内存不足而导致的垃圾回收或内存溢出问题。
总的来说,这条命令常用于生产环境中启动长时间运行的 Java 应用,尤其是在不需要日志输出、也不关心输出结果的情况下。
小结:在 nohup
命令中,>
和 >>
都是用来重定向输出的符号,但它们的行为不同,具体区别如下
1. >
重定向符号
>
是用于 覆盖 重定向的符号。- 当使用
>
时,它会将输出重定向到指定的文件,如果目标文件已存在,它会 覆盖 该文件中的内容。 - 如果目标文件不存在,则会创建该文件并写入输出。
示例:
nohup java -jar app.jar > output.log &
在这个例子中,所有 nohup
命令的标准输出(stdout
)会被重定向到 output.log
文件。如果 output.log
文件已经存在,它会被清空并写入新的输出内容。
2. >>
重定向符号
>>
是用于 追加 重定向的符号。- 使用
>>
时,它会将输出重定向到指定的文件,如果文件已经存在,新的输出将会被 追加 到文件的末尾,而不会覆盖文件的原有内容。 - 如果目标文件不存在,则会创建该文件并写入输出。
示例:
nohup java -jar app.jar >> output.log &
在这个例子中,nohup
命令的标准输出会被追加到 output.log
文件的末尾。如果 output.log
文件不存在,它会被创建并写入输出内容。
总结:
>
:覆盖输出到文件,会清空文件中的内容后写入新的数据。>>
:追加输出到文件,保留文件原有内容,将新数据追加在文件的末尾。
示例应用:
假设你要在运行一个长期任务时收集日志,并且希望每次运行时将日志追加到现有日志文件中,而不是覆盖之前的内容,那么应该使用 >>
。
例如:
nohup java -jar myapp.jar >> myapp.log 2>&1 &
在这个命令中,>> myapp.log
会将标准输出追加到 myapp.log
文件中,而 2>&1
会将标准错误输出也重定向到标准输出,这样所有的输出(包括错误信息)都会被追加到 myapp.log
中。