我需要构建一个脚本来查询具有多个驱动器的远程存储服务器的可用空间。
我只需使用 SSH 登录,运行
df
并将输出放入变量中。看起来像这样:
Array
(
[0] => Filesystem 1K-blocks Used Available Use% Mounted on
[1] => /dev/sda1 59392320 14949240 41426064 27% /
[2] => /dev/sdd1 140592240 114503840 18946708 86% /home/overflow
[3] => /dev/sdf1 287826944 273844324 0 100% /home/node2
[4] => /dev/sde1 287826944 253278964 19927228 93% /home/node3
[5] => /dev/sdg1 287826944 4771768 268434424 2% /home/node4
[6] => /dev/sdh1 287826944 4329780 268876412 2% /home/node5
[7] => /dev/sdi1 488302976 439077756 24420864 95% /home/node1
[8] => /dev/sdh1 287826944 4329780 268876412 2% /home/mnode6
[9] => /dev/sdh1 287826944 4329780 268876412 2% /home/mnode7
[10] => tmpfs 3145728 0 3145728 0% /tmp
)
我需要提取每个“节点”或“mnode”有多少可用空间。所以也许是一个很好的数组,有这样的对:
mnode1 => 24000000
node1 => 24000000
node2 => 0
node3 => 20000000
使用
explode(' ', preg_replace('/ +/', ' ', $line))
获取所有值均已拆分的数组。
要生成一个关联数组,其中键来自
Mounted On
值,值来自 Available
值,您可以循环并解析 shell_exec('df')
输出字符串的行(忽略第一行中的标题)并使用 sscanf()
将数据解析为所需的关联数组。 %*s
将匹配非空白字符,但不会捕获返回的匹配项。我将使用数组解构(在第一个元素之前访问第二个元素,以最大限度地减少声明的变量总数。
代码:
$result = [];
foreach (explode(PHP_EOL, rtrim(shell_exec('df'))) as $i => $line) {
if ($i) {
[1 => $mountedOn, 0 => $result[$mountedOn]] = sscanf($line, '%*s %*d %*d %d %*s %s');
}
}
var_export($result);
输出:
[
'/' => 41426064,
'/home/overflow' => 18946708,
'/home/node2' => 0,
'/home/node3' => 19927228,
'/home/node4' => 268434424,
'/home/node5' => 268876412,
'/home/node1' => 24420864,
'/home/mnode6' => 268876412,
'/home/mnode7' => 268876412,
'/tmp' => 3145728,
]
我还发布了一个非常类似问题的答案:仅显示 shell_exec('df') 中的磁盘使用数据的特定列