Crontab执行Bash脚本时Gnuplot生成的plot.png为空问题求助
问题背景
我在Bash脚本中执行以下操作:
- 每3分钟生成1分钟的二进制数据用于绘制瀑布图,执行命令:
rtl_power_fftw -f 144100000:146100000 -b 500 -n 100 -g 350 -p 0 -e 1m -q -m plot,生成plot.met和plot.bin文件; - 解析
plot.met文件,将bin数量、扫描次数赋值给变量nb_bins和nb_scans; - 通过Gnuplot生成瀑布图PNG文件,脚本片段如下:
gnuplot -persist << EOF plot 'plot.bin' binary array=${nb_bins}x${nb_scans} format='%float' with image set term png set output 'plot.png' replot set term wxt EOF
问题:手动首次运行脚本时plot.png能正常生成,但通过crontab(* * * * * /my/directory/script.sh)自动执行后,plot.bin和plot.met正常更新,plot.png却变成0字节空文件。已尝试改用gnuplot -e、移除set term wxt、调整crontab执行时间、杀死Gnuplot进程等方法,均未解决。
解决方案
1. 修正Gnuplot命令逻辑顺序
原Gnuplot脚本的执行顺序错误,导致非交互式环境下无法正常生成PNG。修改为以下写法:
gnuplot << EOF set term png set output '/my/directory/plot.png' plot '/my/directory/plot.bin' binary array=${nb_bins}x${nb_scans} format='%float' with image EOF
- 移除
-persist参数:crontab运行在无桌面的非交互式会话中,该参数会尝试启动交互式窗口,直接中断绘图流程; - 删掉
set term wxt:wxt是交互式图形终端,无桌面环境下无法初始化,会导致PNG生成失败。
2. 统一使用绝对路径
crontab默认工作目录是用户主目录,而非脚本所在目录,必须确保所有文件和命令都用绝对路径:
- 在脚本开头添加
cd /my/directory,切换到脚本所在目录; - 将
plot.bin、plot.met、plot.png全部替换为完整绝对路径,比如/my/directory/plot.bin; - 用
which gnuplot查看Gnuplot的绝对路径(如/usr/bin/gnuplot),在脚本中直接使用该路径调用,避免环境变量缺失导致找不到命令。
3. 添加日志排查错误
在crontab和脚本中加入日志输出,方便定位问题:
- 修改crontab条目:
* * * * * /my/directory/script.sh >> /my/directory/script_run.log 2>&1,将脚本的标准输出和错误输出都写入日志; - 在脚本中添加
echo "nb_bins: $nb_bins, nb_scans: $nb_scans",确认变量解析是否正确; - 在Gnuplot脚本中添加
set verbose on,让Gnuplot输出详细操作日志,便于排查绘图失败的具体原因。
4. 检查系统依赖
确保系统安装了Gnuplot生成PNG所需的依赖库,比如libcairo2、libpango1.0-0等,不同发行版可通过以下命令安装:
- Debian/Ubuntu:
sudo apt install libcairo2 libpango1.0-0 - RHEL/CentOS:
sudo dnf install cairo pango
内容的提问来源于stack exchange,提问作者gautudp
相关产品推荐
相关产品推荐

