我有一个 TCL 脚本,它运行测试用例,每个测试用例都有一个随机种子 n
次。在对其进行压力测试时(即 200 多个目录),它给了我错误消息
无法创建目录“some_test_directory”:权限被拒绝
。
它可以轻松创建 100 个左右的目录,但是当我真正尝试推送它时,在创建目录快要结束时出现错误。谁能解释这是为什么?如果我没记错的话,它应该能够轻松处理一个主目录中的数千个目录。
编辑:重要 在我的特殊情况下,由于达到 unix 配额限制而发生错误,但提供的答案非常有用,可能会解决 future 的问题。
最佳答案
我想到了两种可能性:
- 你写入的路径是错误的
- 例如,您的脚本运行类似
cd/$A_VARIABLE; mkdir asdf
,但变量扩展为空字符串
- 例如,您的脚本运行类似
- 你提到的配额确实有问题
要找出答案,我会使用 strace/truss 的各种变体之一。 :
# strace (Linux):
# -f: follow child processes
# -v: prints verbose info for various structures/syscalls; this gets
# us environment details like $PWD
~ strace -fv -o /tmp/blah.log your_script_here
# or
# truss (unix):
# -e: dumps environment details when a new process is executed
# -a: shows arguments to exec calls
# -f: follow child processes
~ truss -eaf -o /tmp/blah.log your_script_here
...然后在日志文件中搜索 some_test_directory
。
您将寻找失败的系统调用。在执行大多数工具的过程中,都会有一些系统调用失败但并非异常,因此您不应期望看到的每一次失败都是真正的问题。
输出可能如下所示:
~ truss -eaf -o /tmp/blah.log bash -c 'cd /etc; mkdir -p asdf'
mkdir: "asdf": Permission denied
~ grep mkdir /tmp/blah.log
(...)
18840: stat64("/usr/bin/mkdir", 0xFFBFF5D8) = 0
18840: mkdir("asdf", 0777) Err#13 EACCES [ALL]
...其中第一行(以 = 0
结尾)是成功调用的示例,第二行是未成功调用的示例。
假设路径是相对于 PWD
的,输出将包括环境变量,如 $PWD
。在我的玩具示例中,您可以打开日志并搜索失败的 mkdir
,然后回溯到该进程开始的位置并查看 PWD
的设置。
但是,由于您使用的是 tcl 脚本,它很可能会直接调用 mkdir()
,因此您可能需要寻找通过系统调用更改当前工作目录的内容(例如chdir
).
如果您尝试验证以下内容,您可能会发现问题:
- 确保它真正写入的路径是您可写的
- 确保它正在创建的目录有效(例如,如果/tmp/blah 存在且为空,则它不会尝试创建
/tmp/blah/a/b/c/d
) - 确保来自
mkdir
调用的错误代码确实是权限被拒绝;无论您使用什么,都可能会误解输出。
关于linux - Unix 随机决定拒绝创建目录的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31483008/