You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:33:19