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

标签 linux unix tcl

我有一个 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/

相关文章:

linux - 在 Linux 中获取内存页的起始地址

linux - Linux下如何通过删除某些字符之间的内容来批量重命名文件名

c - Unix:当读取文件描述符在调用 select() 时关闭时会发生什么

shell - 如何拼接两个数据源(或将参数附加到动态参数列表)?

delphi - 如何在TCL中使用Delphi编译的DLL?

c - "cd"命令在我的自定义 shell 中不起作用

linux - 如何自定义窗口菜单(linux ubuntu)

python - 通过 SSH 命令从 Mac OS X 计算机启动远程脚本

oop - 面向对象的 TCL

exec - 在 Unix 上的 Tcl 中,如何杀死已使用 exec 启动的后台进程?