2

我编写了一个 bash 脚本,它从服务器收集数据并将其发送到一个由 splunkforwarder 监控的日志文件。服务器运行 FreeBSD 并有一个通过 Samba 共享的 ZPool。因此,我当然希望 splunk 关注的一件事是在所述共享上使用了多少空间。

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

#!/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 $1, $3, $4}')

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

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

# Manually
datapool/myshare   4842023944   24758292883

# Via cron
datapool/myshare   9684047889   49516585766

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

我曾尝试以不同用户(包括 root)的身份运行 cron 作业,但结果始终相同。我还将 PATH 环境变量设置为与手动运行此脚本时相同的值(而不是 cron 通常使用的缩短版本)。

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

我真的希望你能在这里帮助我,非常感谢任何提示:)

4

1 回答 1

0

df(1)使用环境变量BLOCKSIZE来确定报告磁盘空间时使用的单位。

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

setenv  BLOCKSIZE  "K"

cron(8)在与登录 shell 不同的环境中运行。您看到的症状与BLOCKSIZEundefined forcron的环境一致,并设置为登录 shell 环境的值kor 1024

于 2018-01-26T15:58:29.473 回答