升级Ubuntu至22.04.2后Gnome Terminal输出出现阶梯错位异常求助
我的环境信息
- 系统:刚从Ubuntu 20.04升级到22.04.2(内核版本5.15.0-67)
- 桌面环境:XFCE
- 终端:Gnome Terminal 3.44.0
遇到的问题
我有一个每日运行了好几年的备份脚本,它会同时向终端输出信息,还会把内容写入日志文件。升级系统后第一次跑脚本,就发现了个奇怪的问题:
- 有时候新输出的行不会像正常那样从终端最左侧开始,而是接在上一行的下一列位置显示,形成阶梯状错位
- 这个现象不是一直出现,正常输出和异常输出会随机切换
- 日志文件里的内容完全正常,所有行都是从左侧开头的,和终端输出不一致
终端异常输出示例
********** backup_type: tar_backup *******************************
********** group: ubu_ssd1 ***************************************
********** group: ubu_ssd1, element: root ************************
****************************************************************** mounting /dev/vg_ssd1/ubu_root_ssd1_snap on /mnt source device:
/dev/vg_ssd1/ubu_root_ssd1_snap source directory: /mnt destination
directory: /home/randy/Backup/home4/ubu_ssd1/update_2023_week_10 tar
--directory=//mnt --create --one-file-system --no-check-device --auto-compress --warning=no-file-ignored --file=/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_root_ssd1_2023_week_10.3.tar
.
--listed-incremental=/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_root_ssd1_2023_week_10.snar
tar update "/mnt" to
"/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_root_ssd1_2023_week_10.3.tar"
completed at 20230308-03:16:23. Elapsed time: 0 hrs 0 min 30 sec********** group: ubu_ssd1, element: boot ************************ ****************************************************************** source device: sdb8 source directory: /boot destination directory: /home/randy/Backup/home4/ubu_ssd1/update_2023_week_10 tar --directory=//boot --create --one-file-system --no-check-device --auto-compress --warning=no-file-ignored --file=/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_boot_ssd1_2023_week_10.3.tar.
--listed-incremental=/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_boot_ssd1_2023_week_10.snar
tar update "/boot" to "/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_boot_ssd1_2023_week_10.3.tar"
completed at 20230308-03:16:26.
Elapsed time: 0 hrs 0 min 0 sec
日志文件正常输出示例(精简版)
****************************************************************** ********** backup_type: tar_backup ******************************* ****************************************************************** ****************************************************************** ********** group: ubu_ssd1 *************************************** ****************************************************************** ****************************************************************** ********** group: ubu_ssd1, element: root ************************ ****************************************************************** mounting /dev/vg_ssd1/ubu_root_ssd1_snap on /mnt source device: /dev/vg_ssd1/ubu_root_ssd1_snap source directory: /mnt destination directory: /home/randy/Backup/home4/ubu_ssd1/update_2023_week_10 tar --directory=//mnt --create --one-file-system --no-check-device --auto-compress --warning=no-file-ignored --file=/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_root_ssd1_2023_week_10.3.tar . --listed-incremental=/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_root_ssd1_2023_week_10.snar tar update "/mnt" to "/home/randy/Backup/home4/ubu_ssd1/update_2023_week_10/ubu_root_ssd1_2023_week_10.3.tar" completed at 20230308-03:16:23. Elapsed time: 0 hrs 0 min 30 sec
我做过的排查
- 检查脚本代码:输出内容有普通的
echo、带参数的echo -e,还有其他命令的输出,所有输出都是通过tee同时输出到终端和日志,理论上两者内容应该完全一致 - 写了测试脚本:循环执行500次
echo命令,终端输出完全正常,没法复现这个错位问题
脚本里的相关代码片段
echo "mounting ${mntpnt_volume} on ${mntpnt}" | tee -a ${gc_logfile}; echo "source device: ${source_device}" | tee -a "${gc_logfile}"; echo "source directory: ${source_directory}" | tee -a "${gc_logfile}"; echo "destination directory: ${dest_directory}" | tee -a "${gc_logfile}"; echo -e "\n${c_stars1}${c_stars2}" | tee -a ${gc_logfile}; echo -e "${c_stars1} ${star_gap_string}" \ "${c_stars2:${star_gap}}" | tee -a ${gc_logfile}; echo -e "${c_stars1}${c_stars2}" | tee -a ${gc_logfile};
这个脚本在Ubuntu 20.04下跑了好几年都没问题,升级后才出状况,有没有大佬知道这是咋回事?
补充:我找到问题原因了!
问题出在脚本里调用了PulseAudio的paplay命令,并且是作为子进程从root用户执行的,这时候需要重置环境变量XDG_RUNTIME_DIR,这个操作的时序问题导致了终端输出错位。
本来想给问题加paplay和XDG_RUNTIME_DIR标签,但因为声望不够没法添加,希望能帮到遇到类似问题的朋友。
备注:内容来源于stack exchange,提问作者Randyman99

