温馨提示×

为何nohup日志中文乱码了

小樊
39
2026-08-05 09:07:49
栏目: 编程语言

nohup 日志出现中文乱码,通常不是 nohup 本身的问题,而是字符编码不一致导致的。下面按常见原因和解决办法给你系统梳理一下。


一、根本原因

日志文件编码 ≠ 终端/系统编码 ≠ 程序输出编码

当三者不一致时,中文就会变成乱码。


二、最常见原因 & 对应解决方案

✅ 1. 系统 / 终端语言环境不是 UTF-8(最常见)

检查系统编码

locale

如果你看到类似:

LANG=C
LC_ALL=

或不是 UTF-8,那基本就是它了。

解决方式

临时生效:

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

永久生效(推荐):

# ~/.bashrc 或 ~/.bash_profile
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

然后重新登录或执行:

source ~/.bashrc

再重新运行:

nohup java -jar app.jar > app.log 2>&1 &

这是 80% 乱码问题的根源


✅ 2. Java / Python 程序本身输出编码不是 UTF-8

Java 程序

启动时指定编码:

nohup java -Dfile.encoding=UTF-8 -jar app.jar > app.log 2>&1 &

查看当前默认编码:

java -XshowSettings:properties -version

Python 程序

export PYTHONIOENCODING=utf-8
nohup python3 app.py > app.log 2>&1 &

或在代码里:

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

✅ 3. 用 cat / less / vim 查看时乱码

有时日志本身是对的,只是查看工具编码不对

vim 中乱码

:set encoding=utf-8
:set fileencodings=utf-8

less 乱码

export LESSCHARSET=utf-8
less app.log

✅ 4. 重定向时编码被“污染”

错误示例(容易出问题):

nohup sh run.sh > log 2>&1 &

如果 run.sh 里没设置编码,就会乱码。

✅ 正确做法:

nohup bash -c "export LANG=en_US.UTF-8; java -jar app.jar" > app.log 2>&1 &

✅ 5. 服务器是最小化安装(无中文 locale)

有些服务器根本没有 UTF-8 locale。

检查是否支持

locale -a | grep utf

如果没有,需要安装:

# CentOS / Rocky
yum install -y glibc-locale-source
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8

三、快速自检清单 ✅

你可以按顺序检查:

  1. locale 是否是 UTF-8 ✅
  2. 程序是否指定了 -Dfile.encoding=UTF-8PYTHONIOENCODING
  3. file app.log 看日志编码 ✅
  4. vim / less 打开是否正常 ✅

四、一句话总结

nohup 日志中文乱码,99% 是 LANG / LC_ALL 不是 UTF-8,或程序输出编码不是 UTF-8。

如果你愿意,可以把下面信息发我,我可以精准定位:

  • 系统(CentOS / Ubuntu / 容器?)
  • 程序语言(Java / Python / Shell)
  • locale 输出
  • 乱码截图或示例字符

0