如何确保文件系统已准备好在测试脚本中卸载?
How can I make sure a filesystem is ready for unmounting in a test script?
我正在使用 bats 来测试一些 bash 脚本。在其中一个测试中,我需要挂载生成的 iso 磁盘映像并对其内容进行断言。
当我尝试在测试后立即卸载磁盘映像时,出现 Device or resource busy
错误,除非我在卸载操作之前插入睡眠时间。
脚本如下所示:
setup() {
load 'test_helper/bats-support/load'
load 'test_helper/bats-assert/load'
}
teardown() {
if [ -f "$BATS_TEST_TMPDIR"/mnt/my_file.txt ]; then
sleep 1
fusermount -u "$BATS_TEST_TMPDIR"/mnt
fi
}
@test 'check iso content' {
generate_iso "$BATS_TEST_TMPDIR"/my_iso.iso
mkdir "$BATS_TEST_TMPDIR"/mnt
fuseiso "$BATS_TEST_TMPDIR"/my_iso.iso "$BATS_TEST_TMPDIR"/mnt
assert grep 'A required string' < "$BATS_TEST_TMPDIR"/mnt/my_file.txt
}
这在某种程度上可行,但我对任意睡眠时间不是 100% 满意,根据文件关闭的时间,该睡眠时间可能足以或可能不足以使卸载成功。
我试图通过使用 fuser -mk "$BATS_TEST_TMPDIR"/mnt
而不是休眠来终止访问已安装文件系统的进程,但这最终会终止进程 运行 测试。
有什么办法可以避免任意睡眠时间吗?我可以让 OS 等待文件关闭后再继续吗?任何帮助将不胜感激。
这其实很简单,我只需要在最后 grep
关闭文件即可(注意 <&-
):
assert grep 'A required string' <&- "$BATS_TEST_TMPDIR"/mnt/my_file.txt
teardown() {
if [ -f "$BATS_TEST_TMPDIR"/mnt/my_file.txt ]; then
fusermount -u "$BATS_TEST_TMPDIR"/mnt
fi
}
@test 'check iso content' {
generate_iso "$BATS_TEST_TMPDIR"/my_iso.iso
mkdir "$BATS_TEST_TMPDIR"/mnt
fuseiso "$BATS_TEST_TMPDIR"/my_iso.iso "$BATS_TEST_TMPDIR"/mnt
assert grep 'A required string' <&- "$BATS_TEST_TMPDIR"/mnt/my_file.txt
}
我正在使用 bats 来测试一些 bash 脚本。在其中一个测试中,我需要挂载生成的 iso 磁盘映像并对其内容进行断言。
当我尝试在测试后立即卸载磁盘映像时,出现 Device or resource busy
错误,除非我在卸载操作之前插入睡眠时间。
脚本如下所示:
setup() {
load 'test_helper/bats-support/load'
load 'test_helper/bats-assert/load'
}
teardown() {
if [ -f "$BATS_TEST_TMPDIR"/mnt/my_file.txt ]; then
sleep 1
fusermount -u "$BATS_TEST_TMPDIR"/mnt
fi
}
@test 'check iso content' {
generate_iso "$BATS_TEST_TMPDIR"/my_iso.iso
mkdir "$BATS_TEST_TMPDIR"/mnt
fuseiso "$BATS_TEST_TMPDIR"/my_iso.iso "$BATS_TEST_TMPDIR"/mnt
assert grep 'A required string' < "$BATS_TEST_TMPDIR"/mnt/my_file.txt
}
这在某种程度上可行,但我对任意睡眠时间不是 100% 满意,根据文件关闭的时间,该睡眠时间可能足以或可能不足以使卸载成功。
我试图通过使用 fuser -mk "$BATS_TEST_TMPDIR"/mnt
而不是休眠来终止访问已安装文件系统的进程,但这最终会终止进程 运行 测试。
有什么办法可以避免任意睡眠时间吗?我可以让 OS 等待文件关闭后再继续吗?任何帮助将不胜感激。
这其实很简单,我只需要在最后 grep
关闭文件即可(注意 <&-
):
assert grep 'A required string' <&- "$BATS_TEST_TMPDIR"/mnt/my_file.txt
teardown() {
if [ -f "$BATS_TEST_TMPDIR"/mnt/my_file.txt ]; then
fusermount -u "$BATS_TEST_TMPDIR"/mnt
fi
}
@test 'check iso content' {
generate_iso "$BATS_TEST_TMPDIR"/my_iso.iso
mkdir "$BATS_TEST_TMPDIR"/mnt
fuseiso "$BATS_TEST_TMPDIR"/my_iso.iso "$BATS_TEST_TMPDIR"/mnt
assert grep 'A required string' <&- "$BATS_TEST_TMPDIR"/mnt/my_file.txt
}