【问题标题】:On Linux, does the remove command "rm" run in the background?在 Linux 上,删除命令“rm”是否在后台运行?
【发布时间】:2020-01-06 11:27:03
【问题描述】:

我正在尝试使用以下脚本运行将近 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 命令删除早期运行的旧输出(延迟介绍),然后运行我下面的忍者命令。这是真的吗?

【问题讨论】:

  • 您究竟是如何运行并行线程的?如果这个 shell 脚本的六个实例同时运行,如果它们共享同一个构建目录,它们当然会践踏彼此的状态。
  • 我正在使用下面的 ctest 宏:CTEST_PARALLEL_LEVEL。这是一个 CMake 环境变量。

标签: shell delay rm ninja ctest


【解决方案1】:

编辑: 看来,虽然一般问题很容易回答(即rm 不在后台运行),但您遇到的具体问题更复杂,需要一些潜在的操作系统级调试。 StackOverflow 上的任何人都无法为您执行此操作:D

对于您的特定问题,我建议使用与删除文件不同的策略来避免这种麻烦。为了确保您的构建目录是原始的,您可以使用一个新的临时目录,以防您想要进行干净的构建。


初步答案:

rm 命令将不会在“后台”运行或以任何方式与脚本中的其他命令同时运行,除非您明确告诉它(例如,在末尾使用 &命令)。一旦完成(即执行 bash 脚本中的下一个命令),文件应该已被删除。因此,您的问题可能出在其他地方。

话虽如此,例如,如果您使用网络共享、FUSE 文件系统或任何其他改变您的文件系统如何或何时对操作系统的删除请求作出反应的机制,则行为可能会有所不同。

【讨论】:

  • 真。我读的一样。但是,如果我没有等待删除完整的 40 GB 旧二进制文件,我会收到错误消息。如果我等到完整的文件夹变空,我将成功运行我的测试用例。它表明 rm -rf 在完全删除之前完成所有旧的二进制文件??
  • 你的设置是什么样的?文件是否在本地磁盘上? rms 退出代码是什么?是否还有其他影响您的测试运行的因素在等待时也会消失?例如系统负载,一些被删除的临时文件,...?
  • 在再次运行脚本之前,我试图手动运行 rm -rf。所以我可以看到旧文件夹和二进制文件被完全删除。然后我没有从我的脚本中受益。
  • ,我在我的severer上运行它。我如何检查脚本中的 rm -rf 返回值。您能否指导我将 if 语句放入脚本中以检查 rm -rf 的返回状态。如果正确,那么只有我可以执行下一个命令运行
  • 我已经更新了我的答案。如果你愿意的话,我鼓励你自己做调试部分,因为这里的人很难为你做这件事。我提出了一个潜在的解决方案,您可能不费吹灰之力就能完成。
【解决方案2】:

比这要复杂一些。 rm 不会在后台运行。可以肯定的是,删除至少是在逻辑上完成的(因此从用户的角度来看,东西被删除了);这意味着在某些操作系统上,即使命令已终止,也有可能在内核中完成低级删除(内核然后真正清除了您背后的一些内部结构)。但这通常不会干扰您的脚本。你的问题肯定在别处。

可能是某些进程保留了一些文件,即使它们似乎已被删除...因此磁盘可能无法如您预期的那样被释放。然后,您必须完成这些进程,以便内核真正清理文件...

【讨论】:

  • 那么我应该在我的脚本中放置延迟命令等待 rm -rf 命令之后吗?
  • 不,这可能根本没有帮助。你的基本假设仍然是错误的。 “你的问题肯定在别处。”
猜你喜欢
  • 2015-08-17
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多