当通过 cron 运行 时,df 在 FreeBSD 上显示实际大小的两倍

df shows double the actual size on FreeBSD when run via cron

我写了一个 bash 从服务器收集数据的脚本 并将其发送到一个日志文件,该文件由一个 splunkforwarder。服务器 运行s FreeBSD 并且有一个 ZPool 通过 Samba 共享。所以当然是我想要的一件事 splunk 关注的是在所述共享上使用了多少 space。

为了保持可读性,我从我的脚本中提取了实现此目的的行:

#!/usr/bin/env bash
while read disk used avail ; do
        # In reality I pass these values to a function
        # that adds some formatting, but let's keep it
        # simple for the moment
        echo $disk " " $used " " $avail
done < <(df | awk '/datapool\// {print , , }')

当我从命令行 运行 这些行时,我得到了正确的 数字(我将输出与 zfs list 进行了比较)。 但是当我通过 cron 运行 这个脚本时,我得到的数字都是 加倍。

让我们看看我机器上的确切输出:

# Manually
datapool/myshare   4842023944   24758292883

# Via cron
datapool/myshare   9684047889   49516585766

这只发生在 FreeBSD 上。我有另一个 ZFS 存储服务器 运行s 在 Debian 上,当我 运行 那里有完全相同的脚本时, 我总是得到正确的数字。

我已经尝试 运行以不同的用户身份执行 cron 作业 (包括根),但它总是相同的结果。我也有 将 PATH 环境变量设置为与我相同的值 当我 运行 这个脚本手动(而不是缩短 cron 通常使用的版本)。

我完全不知道这个问题的原因 而且我真的不知道如何调试这个问题。加上我 甚至在互联网上找不到任何信息 与此问题远程相关。

我真的希望你能帮我解决这个问题,任何提示都是 非常感谢:)

df(1)使用环境变量BLOCKSIZE来确定报告磁盘时使用哪些单位space。

默认情况下,由于历史原因,使用的块大小为 512。通常在一个人的登录 shell 环境中将此变量设置为更方便的值。例如:

setenv  BLOCKSIZE  "K"

cron(8) 使用与登录 shell 不同的环境运行。您看到的症状与 BLOCKSIZE 未定义 cron 的环境一致,并为登录 [= 的环境设置为 k1024 的值25=].