Unix随机决定拒绝创建目录的权限

时间:2015-07-17 19:06:49

标签: linux unix tcl

我有一个TCL脚本,它运行各自具有随机种子n次数的测试用例。在对它进行压力测试(即200多个目录)时,它会给我错误信息

can't create directory "some_test_directory": permission denied

它可以轻松创建100个目录左右,但是当我真的尝试推送它时,我会在创建目录结束时收到错误。谁能解释为什么会这样?如果我没有弄错,它应该能够轻松地处理主目录中的数千个目录。

编辑:重要 在我的特定情况下,由于达到unix配额限制而发生错误,但提供的答案非常有用,可能会解决未来的问题。

2 个答案:

答案 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存在且为空,则不会尝试创建/tmp/blah/a/b/c/d
  • 确保mkdir通话中的错误代码确实被拒绝;无论你使用什么,都可能误解输出。

答案 1 :(得分:-1)

在顶级脚本中,请务必设置可用的UMASK(建议0)。对于每个mkdir(),设置perms 0x777