我需要一种命令行方法来创建一个文件,其大小(以字节为单位)是磁盘上可用空间的百分比。我打算每五分钟通过 cron 运行一次,但首先使用 shell 脚本就可以了。
目标平台是DOMAIN/OS中的BSD4.3环境,因此我有ksh
、、awk
和sed
常用的BSD命令,但没有GNU版本。
我可以运行命令lvolfs -a
(不是BSD 命令)以以下格式列出卷可用空间:
# free # total % free node id entry directory
732532 1295672 57 4D72C /
3787184 4165732 91 52055 //tr3
-------------------------------
4519716 5461404 82.76% 2 volumes.
因此提取值似乎很简单,在本例中为 57 和 91,分别通过十六进制节点 ID 4D72C 和 52055 来识别它们。
我立即想到“dd 可以做到”,因此首先集中精力于节点 4D72C,我想出了:
/com/lvolfs -a | \
awk -e '/4D72C/ { print $3 }' | \
sed -e 's|^|dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=|' | \
sed -e 's|$| count=1|' >//tr2/archive/dirlist
. //tr2/archive/dirlist
看起来dirlist
像
dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=57 count=1
它有效,我需要对节点 52055 重复类似的操作,但我想知道这是否dd
是使用真正基本的 BSD 命令的唯一方法。有人有什么建议吗?
编辑:关于目标系统的一些背景信息...它是 HP/Apollo DN433“工程工作站”,80 年代初发布时非常出色,但现在与 486DX 系统一样令人印象深刻。本机操作系统试图通过提供具有合理 BSD 命令集的 BSD4.3“环境”来模仿 Unix,但有一种将 BSD 和宙斯盾命令(如lvolfs
),就像我在这里所做的那样。
我有两个工作站,每个工作站都控制自动测试设备。这两个工作站联网在一起,网络根目录//
包括 tr2(节点 ID 4D72C)和 tr3(节点 ID 52055)。你并不真的想要或需要知道所有这些事情- 我只是想让人们明白,任何事情都不应该被视为理所当然。我不希望任何人在这些事情上浪费太多时间——我的工作,但如果您有任何建议,我将不胜感激。Korn Shell 对我来说仍然有点神秘。
更新:df -a
DOMAIN/OS 中的命令提供
$ df -a
Filesystem kbytes used avail capacity Mounted on
/dev/wn96a 1295672 563904 731768 44% //tr2
/dev/wn96a 4165732 379804 3785928 9% //tr3
----------------------------------
5461300 943700 4517600 17%
因为它提到了更熟悉的名字tr2和tr3,可能是更好的选择。唯一的轻微障碍是我们需要磁盘空间用过的不是自由的,但这可以克服。
答案1
我会使用dd
。你说“lvolfs -a(不是 BSD 命令)”。你有吗df
?那将是一种更标准、更便携的获取卷使用信息的方法。
无需创建临时脚本文件即可执行此操作。您应该能够执行以下操作:
dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=\
$(/com/lvolfs -a | awk -e '/4D72C/ { print $3 }') count=1
或者
avail=$(df /usr | awk -e 'NR==2 { print $5 }')
avail=${avail%*%} # strip off the percent sign
dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=$avail count=1
(取决于您的文件系统如何组织以及输出是什么df
样子的)。
你甚至可以把第二个放在循环中:
for fs in / /usr /home # list the ones you want to include
do
avail=$(df $fs | awk -e 'NR==2 { print $5 }')
avail=${avail%*%} # strip off the percent sign
# create a file on the particular filesystem/mount point
dd if=/dev/rdsk of=//$fs/test/data/tr2.free bs=$avail count=1
done
请在使用前仔细检查以确保它能够达到您的预期。