工作中,我们经常会使用nohup命令来让程序在后台执行。那么输出日志就成了困扰我们的难题。每次都是忘记了就百度查询。十分的不方便。
所以,做个记录吧。方便自己查询。
本次我们使用jar包的方式来测试。
1. 准备工作
创建一个HelloWorld工程
- groupId为:com.du
- 代码如下:
package com.du;
import java.util.concurrent.TimeUnit;
public class HelloWorld {
public static void main(String[] args) throws InterruptedException {
// 设置系统属性,指定字符集为 UTF-8
System.setProperty("file.encoding", "UTF-8");
try {
for (int i = 0; i < 10; i++) {
TimeUnit.SECONDS.sleep(1);
if (args.length > 0) {
if ("true".equals(args[0]) && 3 == i) {
throw new RuntimeException("test error!!!");
}
}
System.out.println("This is a error happen ... " + i);
}
} catch (RuntimeException e) {
System.err.println(e.getMessage());
System.err.flush(); // 强制刷新标准错误流
throw e;
}
}
}
创建jar包
- 进入到项目目录:
cd HelloWorld/src/main/java
- 编译文件
javac -encoding UTF-8 com/du/HelloWorld.java
- 创建文件 MANIFEST.MF。在第一步的目录中,文件内容如下:
Manifest-Version: 1.0
Main-Class: com.du.HelloWorld
- 创建jar包
jar cvfm HelloWorld.jar MANIFEST.MF com/du/HelloWorld.class
- 测试
java -Dfile.encoding=UTF-8 -jar HelloWorld.jar # 不输出错误信息
java -Dfile.encoding=UTF-8 -jar HelloWorld.jar true # 输出错误信息
2. nohup测试
命令 | 解释 |
---|---|
>/dev/null | 将标准输出重定向到空设备(即不显示标准输出内容) |
0 | 标准输入 |
1 | 标准输出 |
2 | 错误输出 |
2>&1 | 将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,所以标准错误也不会显示 |
举例说明:
-
nohup java -jar HelloWorld.jar true &
-
保留所有信息:
nohup java -jar HelloWorld.jar true >/dev/null 1>err.log &
-
nohup java -jar HelloWorld.jar true >/dev/null 2>err.log &
-
nohup java -jar HelloWorld.jar true >/dev/null 2>&1 &
其他一
-
nohup java -jar HelloWorld.jar true >/dev/null 2>&1 &
:
nohup
:让命令在后台运行,即使关闭终端也不会停止。
java -jar HelloWorld.jar true
:运行名为HelloWorld.jar的 Java 程序,并传入参数true。
>/dev/null
:将标准输出重定向到空设备(即不显示标准输出内容)。
2>&1
:将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,所以标准错误也不会显示。
&
:将命令放入后台运行。 -
nohup java -jar HelloWorld.jar true >/dev/null 1>err.log &
:
前面部分与第一条类似。
1>err.log
:将标准输出重定向到名为err.log的文件中。但这里标准错误仍然会显示在终端(如果有错误输出的话),因为没有对标准错误进行处理。 -
nohup java -jar HelloWorld.jar true >/dev/null 2>err.log &
:
同样,nohup和后台运行部分与前面相同。
>/dev/null
:标准输出不显示。
2>err.log
:将标准错误重定向到err.log文件中。如果程序有错误输出,会被写入到这个文件中,而标准输出仍然不显示。 -
nohup java -jar HelloWorld.jar true >/dev/null 2>&1>err.log &
:
nohup
和后台运行部分不变。
>/dev/null
:标准输出不显示。
2>&1
:将标准错误重定向到标准输出。
>err.log
:由于标准输出已经重定向到了标准错误,所以最终标准输出和标准错误都被重定向到err.log文件中。
其他二
在 shell 中,这些重定向符号用于控制命令的输入、输出和错误流。以下是详细解释:
一、数字含义
-
0
:代表标准输入(stdin),通常是键盘输入或从其他程序传递过来的数据。 -
1
:代表标准输出(stdout),即命令正常执行的输出结果。 -
2
:代表标准错误输出(stderr),通常是命令执行过程中出现的错误信息。
二、重定向符号解释
-
>
(重定向输出):
-
1>
或>
:将标准输出重定向到指定的文件或设备。例如,command > output.txt
会将命令的标准输出写入到output.txt文件中,如果文件不存在则创建,如果文件已存在则覆盖原有内容。 -
2>
:将标准错误输出重定向到指定的文件或设备。例如,command 2> error.log
会将命令的错误输出写入到error.log文件中。
-
>>
(追加输出):
-
1>>
或>>
:将标准输出追加到指定的文件。与>不同的是,它不会覆盖原有文件内容,而是在文件末尾添加新的内容。 -
2>>
:将标准错误输出追加到指定的文件。
-
<
(重定向输入):
-
command < input.txt
:将input.txt文件的内容作为命令的标准输入。
-
2>&1
:
- 将标准错误输出重定向到标准输出。通常与其他重定向符号一起使用,例如
command > output.txt 2>&1
,表示将命令的标准输出和标准错误输出都写入到output.txt文件中。
三、其他组合和用法
- 可以同时重定向标准输出和标准错误输出到不同的文件:
-
command > output.txt 2> error.log
:标准输出写入output.txt,标准错误输出写入error.log。
- 重定向标准输入、输出和错误流:
-
command < input.txt > output.txt 2> error.log
:从input.txt读取输入,将标准输出写入output.txt,将标准错误输出写入error.log。
- 使用管道和重定向结合:
command1 | command2 > output.txt
:将command1的输出通过管道传递给command2处理,然后将command2的标准输出写入output.txt文件。
这些重定向符号和组合可以灵活地控制命令的输入和输出,方便在 shell 脚本和命令行中处理数据和错误信息。