在 CentOS 上使用 nohup 运行程序出现日志乱码,通常不是 nohup 本身的问题,而是字符编码不一致导致的。下面按常见原因给你系统排查和解决方案。
locale
正常情况应看到:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
如果看到:
LANG=C
LANG=POSIX
或没有 UTF-8,就非常容易乱码。
✅ 解决:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
永久生效(推荐):
echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=zh_CN.UTF-8' >> ~/.bashrc
source ~/.bashrc
nohup.out 不会自动使用 UTF-8,而是直接继承当前环境编码。
nohup java -jar app.jar > nohup.out 2>&1 &
如果启动前 LANG 不是 UTF-8,日志就会乱码。
✅ 正确方式:
LANG=zh_CN.UTF-8 nohup java -jar app.jar > nohup.out 2>&1 &
JVM 默认使用系统编码,可能不是 UTF-8。
✅ 指定 JVM 编码:
nohup java -Dfile.encoding=UTF-8 -jar app.jar > nohup.out 2>&1 &
查看当前 JVM 编码:
java -XshowSettings:properties -version
Python 3 默认 UTF-8,但 CentOS 7 老环境可能异常。
✅ 显式指定:
nohup python3 -u app.py > nohup.out 2>&1 &
或:
export PYTHONIOENCODING=utf-8
即使服务器没问题,本地终端编码不对也会看起来乱码。
echo $LANG
file nohup.out
如果是:
ISO-8859 text
或
Non-UTF8 data
iconv -f gbk -t utf-8 nohup.out > nohup_utf8.out
(如果是 GBK)
LANG=zh_CN.UTF-8 nohup java -Dfile.encoding=UTF-8 -jar app.jar \
> app.log 2>&1 &
nohup ./app > app.log 2>&1 &
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
| 检查项 | 命令 |
|---|---|
| 系统编码 | locale |
| 终端编码 | SSH 客户端 |
| 程序编码 | Java / Python 参数 |
| 日志编码 | file nohup.out |
如果你愿意,可以把下面信息发我,我可以精准定位:
cat /etc/centos-release)locale 输出file nohup.out 输出我可以直接给你一条可用命令。