nohup 日志出现乱码,通常不是 nohup 本身的问题,而是字符编码、终端环境、程序输出方式不匹配导致的。下面按常见原因逐一说明:
典型场景
java -jar app.jar > nohup.out
Java 默认编码可能不是 UTF-8。
✅ 解决:
java -Dfile.encoding=UTF-8 -jar app.jar
nohup 启动时常丢失终端环境:
nohup xxx.sh &
但当前 shell 的 LANG 可能未设置:
echo $LANG
# 可能为空或 POSIX
✅ 解决:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
nohup xxx.sh > nohup.out 2>&1 &
很多程序(尤其老项目):
会直接按系统默认编码写日志。
✅ 示例(Python):
# 错误
print("中文")
# 正确
print(u"中文".encode("utf-8"))
nohup cmd > nohup.out
如果程序输出包含:
\r在普通文件里就会“看起来像乱码”。
✅ 解决:
nohup cmd | stdbuf -oL cat > nohup.out 2>&1 &
或程序加 --no-color
即使日志是 UTF-8:
也会显示乱码。
✅ 验证:
file nohup.out
✅ 正确打开:
less nohup.out
vim nohup.out
# 或设置编码
:set encoding=utf-8
日志从 Windows 拷过来直接乱码。
✅ 转换:
iconv -f gbk -t utf-8 nohup.out > new.out
✅ 结论:
nohup只是忽略挂断信号,不做编码转换
乱码 100% 来自程序输出或环境编码
echo $LANG
file nohup.out
locale
如果你愿意,可以贴:
nohup 启动命令我可以直接帮你定位是哪一类问题。