我正在尝试使用以下脚本运行我的测试用例,这些测试用例接近 40k。
只是显示脚本的某些部分 -
#!/bin/bash
# RUN script
echo "please run with: nice nohup ./run_script"
# working directory where script is stored
WORKING_DIR=$(pwd)
# temp directory to build and run the cmake ctest
BUILD_DIR=${BUILD_DIR:-/localtemp/build}
# clean and make build directory
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
mkdir -p $BUILD_DIR/../result
cmake -G Ninja
ninja test
注意:我正在使用 6 个内核的并行线程来运行我的测试用例。
在第一次尝试中,所有内容都通过了,这是我修复了测试用例中的所有错误时的真实情况。
但是有些时候如果我想重新运行相同的脚本,那么我在运行 40k 中的一些测试用例时会出现错误。但是,如果我单独(一个接一个(运行失败的测试用例,那么它们就会完美地通过。
所以我假设rm -rf
需要一些时间来删除所有情况的旧二进制文件和符号(40 GB 文件(。 所以我需要等待完全删除,然后再次运行我的脚本.所以我应该在我的脚本中rm -rf
命令后添加一些延迟.
我在某处读到rm -rf
一旦完成工作就会返回状态.然后只执行下一个命令。但是我的 scnerio 看起来像是显示rm -rf
正在后台运行。
意味着当我停止早期运行时,我不应该立即开始新的运行。我需要给一些时间在脚本中使用rm -rf
命令(延迟介绍(从早期运行中删除旧输出,然后运行我的 ninja 命令。这是真的吗?
编辑:看来,虽然一般问题很容易回答(即rm
不在后台运行(您遇到的具体问题更为复杂,需要一些潜在的操作系统级调试。StackOverflow上没有人能够为你做到这一点:D
对于您的特定问题,我建议使用与删除文件不同的策略来避免这种匆忙。为了确保您的构建目录是原始的,您可以使用新的临时目录,以防您想要进行干净的构建。
初始答案:
rm
命令不会"在后台"运行,也不会以任何方式与脚本中的其他命令并发运行,除非您明确告诉它这样做(例如,在命令末尾使用&
(。完成后(即执行 bash 脚本中的下一个命令(,文件应该已被删除。因此,您的问题可能出在其他地方。
话虽如此,例如,如果您使用网络共享、FUSE 文件系统或任何其他机制来更改文件系统对操作系统删除请求的反应方式或时间,则行为可能会有所不同。
它比这要复杂一些。rm
不会在后台运行。可以肯定的是,删除至少是合乎逻辑的(因此从用户的角度来看,内容被删除(;这意味着在某些操作系统上,即使命令已终止,也可能在内核中完成低级删除(然后内核会真正清理您背后的一些内部结构(。但这通常不应干扰您的脚本。你的问题肯定在别处。
可能是某些进程保存了一些文件,即使它们似乎被删除了......因此,磁盘无法按预期释放。然后,您必须完成这些过程,以便内核真正清理文件......