我有一个TCL脚本,它运行各自具有随机种子n
次数的测试用例。在对它进行压力测试(即200多个目录)时,它会给我错误信息
can't create directory "some_test_directory": permission denied
。
它可以轻松创建100个目录左右,但是当我真的尝试推送它时,我会在创建目录结束时收到错误。谁能解释为什么会这样?如果我没有弄错,它应该能够轻松地处理主目录中的数千个目录。
编辑:重要 在我的特定情况下,由于达到unix配额限制而发生错误,但提供的答案非常有用,可能会解决未来的问题。
答案 0 :(得分:1)
有两种可能性可以想到:
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/a/b/c/d
)mkdir
通话中的错误代码确实被拒绝;无论你使用什么,都可能误解输出。答案 1 :(得分:-1)
在顶级脚本中,请务必设置可用的UMASK(建议0)。对于每个mkdir(),设置perms 0x777