在 perl 的反引号中使用 chmod 后导致权限异步更改的原因
What is causing asynchronous changes of permissions after usage of chmod in backticks in perl
TL;DR - 转到 UPDATE 以获取玩具示例。在我能够在一个小示例中重现该问题之前,以下是我最初的问题,为清楚起见进行了编辑。
我不明白这是怎么回事。我急于想弄清楚为什么我用 perl 编写的测试总是失败。
我正在测试一个函数,该函数在打开输出日志文件失败时关闭日志记录,这样就不会抑制到 STDERR 的输出。为了测试它是否有效,我即时创建了一个文件并将其修改为不可写。代码的结果 运行 应该将打开错误与所有其他 STDERR 一起打印到 STDERR 输出。在 运行 测试之前,我在反引号中执行了 chmod。
然而,发生的事情是日志文件不断被写入而没有错误 - 所以测试失败了。我开始通过在不同地方打印 ls -halF
的输出来进行健全性检查,以查看权限更改发生的位置。最初的 chmod 似乎起作用了:
`echo > file.log;chmod 444 file.log;ls -halF file.log`
在一些其他设置确认预期权限后的后续 ls -halF file.log
,但在我的 运行 实际测试代码中很早的一行代码表示所有者具有写权限!
我最终发现了问题的解决方法 - 通过在反引号中使用 perl chmod()
方法而不是 chmod,这让我觉得发生了一些异步的事情 - 这对我来说毫无意义。
我最终尝试了那个,因为在我的无数次测试中,我偶尔会看到一个测试随机成功。所以我写了一个快速循环来一遍又一遍地执行相同的测试 - 并发现它随机地成功了大约 30% 的时间!这就是让我认为这个问题可能存在某种异步性的原因,我无法解释,因为我认为反引号本质上是在等待过程完成,因为它 returns 输出 - 那么这里发生了什么?没看懂。
为了完整性 - 实际的测试命令也是用反引号完成的 - 它 运行 是一个独立的脚本。
在我下面的更新中,我展示了一个不同的案例,但它展示了权限状态的随机性...
更新
好的。这是一个演示问题的独立小示例。注意每一种情况下第二行的输出不同...
deleteme1.pl
#!/usr/bin/perl
print(`echo '' > deleteme.log;chmod 444 deleteme.log`);
print("1: ",`ls -l deleteme.log`);
`chmod 777 deleteme.log;rm -f deleteme.log`;
deleteme2.pl
#!/usr/bin/perl
print(`echo '' > deleteme.log;chmod 444 deleteme.log`);
print("2: ",`ls -l deleteme.log`);
chmod 0777, "deleteme.log";
unlink("deleteme.log");
现在观察这个重复循环的输出:
tcsh> foreach f ( `seq 1 30` )
perl deleteme1.pl
perl deleteme2.pl
end
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
请注意,所有者权限差异始终来自 deleteme1.pl。我认为 @
表示 macOS 上的扩展属性。这可能与它有关,但有些情况下 xattr 在那里,但没有权限差异...
我也怀疑这个问题可能与此有关:
>ls -1 t | wc -l
46391
所以有些事情是异步发生的 - 这到底是怎么回事?!它可能与 SIP 或 csr(util) 有关吗?
更新 2
这是一个更符合我的具体情况的示例。
deleteme3.pl
这个代表我的修复:
#!/usr/bin/perl
open(TLG,">deleteme.log");
print TLG '';
close(TLG);
chmod 0444, "deleteme.log";
if(open(TEST,">deleteme.log"))
{print "3 opened\n"}
else
{print "3 unable to open\n"}
chmod 0777, "deleteme.log";
unlink("deleteme.log");
deleteme4.pl
这个演示了原始问题。
#!/usr/bin/perl
`echo '' > deleteme.log;chmod 444 deleteme.log`;
if(open(TEST,">deleteme.log"))
{print "4 opened\n"}
else
{print "4 unable to open\n"}
chmod 0777, "deleteme.log";
unlink("deleteme.log");
我循环播放了这 2 个,如上所示:
tcsh>foreach f ( `seq 1 1000` )
perl deleteme3.pl
perl deleteme4.pl
end
在 1000 次尝试中,deleteme3.pl
始终输出 3 unable to open
。 deleteme4.pl
输出了4 opened
4次,其余为4 unable to open
.
显然,这并不能说明我在大多数情况下看到的频率,我的权限显示所有者可写,但我的猜测是我遇到了某种甜蜜点,其中某些东西破坏了我的文件权限.
我很想看看是否有人可以在任何平台上重现这些结果,但我使用的是 macOS Sierra (10.12.6) 运行正在使用系统 perl 版本 5.18.2。
我找出了异步权限更改的罪魁祸首。我在问题中遗漏了一条关键信息:我工作的目录在 Dropbox(!) 中。我不知道 Dropbox 会修改文件的权限,但显然它会。
使用 Dropbox 应用 运行:
tcsh>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -rw-r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
退出 Dropbox 后(仍在 dropbox 目录中):
>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
我发现这个是因为我怀疑 SIP 是罪魁祸首。我以恢复模式重新启动并使用 csrutil disable
禁用了 SIP。重新启动后,我 运行 测试循环并看到 运行domly 更改权限的相同行为,但虽然那是 运行,但我从 dropbox 收到一个对话框说 "Dropbox need to change permissions for the Folder /Users/robleach/Dropbox
"。我单击 OK
并重新 运行 循环,运行dom 权限问题不明显。
我在恢复中重新启动以重新启用 SIP,然后再次重新启动(SIP 处于活动状态)只是为了确认 SIP 未涉及。我重新 运行 循环并再次看到 运行dom 权限问题。然后我退出 dropbox 并重新 运行 循环。结果如上
我公开承认我缺乏知识,以至于我什至没有意识到这个问题的保管箱方面对于回答这个问题至关重要。^而且我承认我在 Dropbox 中有我的开发项目懒惰 - 所以我不必记住 commit/pull 在两台不同的计算机上执行工作之间未完成的更改。但是我在 dropbox 中有这个特定项目多年,直到现在才 运行 遇到任何问题(测试 #757,即按预期执行了 756 次测试)。所以我什至没有想到 Dropbox 可能是这个问题的一个因素。我不知道同步对源设备上的文件进行了主动更改(即文件的创建位置)。
TL;DR - 转到 UPDATE 以获取玩具示例。在我能够在一个小示例中重现该问题之前,以下是我最初的问题,为清楚起见进行了编辑。
我不明白这是怎么回事。我急于想弄清楚为什么我用 perl 编写的测试总是失败。
我正在测试一个函数,该函数在打开输出日志文件失败时关闭日志记录,这样就不会抑制到 STDERR 的输出。为了测试它是否有效,我即时创建了一个文件并将其修改为不可写。代码的结果 运行 应该将打开错误与所有其他 STDERR 一起打印到 STDERR 输出。在 运行 测试之前,我在反引号中执行了 chmod。
然而,发生的事情是日志文件不断被写入而没有错误 - 所以测试失败了。我开始通过在不同地方打印 ls -halF
的输出来进行健全性检查,以查看权限更改发生的位置。最初的 chmod 似乎起作用了:
`echo > file.log;chmod 444 file.log;ls -halF file.log`
在一些其他设置确认预期权限后的后续 ls -halF file.log
,但在我的 运行 实际测试代码中很早的一行代码表示所有者具有写权限!
我最终发现了问题的解决方法 - 通过在反引号中使用 perl chmod()
方法而不是 chmod,这让我觉得发生了一些异步的事情 - 这对我来说毫无意义。
我最终尝试了那个,因为在我的无数次测试中,我偶尔会看到一个测试随机成功。所以我写了一个快速循环来一遍又一遍地执行相同的测试 - 并发现它随机地成功了大约 30% 的时间!这就是让我认为这个问题可能存在某种异步性的原因,我无法解释,因为我认为反引号本质上是在等待过程完成,因为它 returns 输出 - 那么这里发生了什么?没看懂。
为了完整性 - 实际的测试命令也是用反引号完成的 - 它 运行 是一个独立的脚本。
在我下面的更新中,我展示了一个不同的案例,但它展示了权限状态的随机性...
更新
好的。这是一个演示问题的独立小示例。注意每一种情况下第二行的输出不同...
deleteme1.pl
#!/usr/bin/perl
print(`echo '' > deleteme.log;chmod 444 deleteme.log`);
print("1: ",`ls -l deleteme.log`);
`chmod 777 deleteme.log;rm -f deleteme.log`;
deleteme2.pl
#!/usr/bin/perl
print(`echo '' > deleteme.log;chmod 444 deleteme.log`);
print("2: ",`ls -l deleteme.log`);
chmod 0777, "deleteme.log";
unlink("deleteme.log");
现在观察这个重复循环的输出:
tcsh> foreach f ( `seq 1 30` )
perl deleteme1.pl
perl deleteme2.pl
end
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
1: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
2: -r--r--r-- 1 robleach staff 1 May 31 21:01 deleteme.log
请注意,所有者权限差异始终来自 deleteme1.pl。我认为 @
表示 macOS 上的扩展属性。这可能与它有关,但有些情况下 xattr 在那里,但没有权限差异...
我也怀疑这个问题可能与此有关:
>ls -1 t | wc -l
46391
所以有些事情是异步发生的 - 这到底是怎么回事?!它可能与 SIP 或 csr(util) 有关吗?
更新 2
这是一个更符合我的具体情况的示例。
deleteme3.pl
这个代表我的修复:
#!/usr/bin/perl
open(TLG,">deleteme.log");
print TLG '';
close(TLG);
chmod 0444, "deleteme.log";
if(open(TEST,">deleteme.log"))
{print "3 opened\n"}
else
{print "3 unable to open\n"}
chmod 0777, "deleteme.log";
unlink("deleteme.log");
deleteme4.pl
这个演示了原始问题。
#!/usr/bin/perl
`echo '' > deleteme.log;chmod 444 deleteme.log`;
if(open(TEST,">deleteme.log"))
{print "4 opened\n"}
else
{print "4 unable to open\n"}
chmod 0777, "deleteme.log";
unlink("deleteme.log");
我循环播放了这 2 个,如上所示:
tcsh>foreach f ( `seq 1 1000` )
perl deleteme3.pl
perl deleteme4.pl
end
在 1000 次尝试中,deleteme3.pl
始终输出 3 unable to open
。 deleteme4.pl
输出了4 opened
4次,其余为4 unable to open
.
显然,这并不能说明我在大多数情况下看到的频率,我的权限显示所有者可写,但我的猜测是我遇到了某种甜蜜点,其中某些东西破坏了我的文件权限.
我很想看看是否有人可以在任何平台上重现这些结果,但我使用的是 macOS Sierra (10.12.6) 运行正在使用系统 perl 版本 5.18.2。
我找出了异步权限更改的罪魁祸首。我在问题中遗漏了一条关键信息:我工作的目录在 Dropbox(!) 中。我不知道 Dropbox 会修改文件的权限,但显然它会。
使用 Dropbox 应用 运行:
tcsh>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -rw-r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach staff 1 Jun 2 12:09 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:09 deleteme.log
退出 Dropbox 后(仍在 dropbox 目录中):
>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
1: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
2: -r--r--r-- 1 robleach staff 1 Jun 2 12:11 deleteme.log
我发现这个是因为我怀疑 SIP 是罪魁祸首。我以恢复模式重新启动并使用 csrutil disable
禁用了 SIP。重新启动后,我 运行 测试循环并看到 运行domly 更改权限的相同行为,但虽然那是 运行,但我从 dropbox 收到一个对话框说 "Dropbox need to change permissions for the Folder /Users/robleach/Dropbox
"。我单击 OK
并重新 运行 循环,运行dom 权限问题不明显。
我在恢复中重新启动以重新启用 SIP,然后再次重新启动(SIP 处于活动状态)只是为了确认 SIP 未涉及。我重新 运行 循环并再次看到 运行dom 权限问题。然后我退出 dropbox 并重新 运行 循环。结果如上
我公开承认我缺乏知识,以至于我什至没有意识到这个问题的保管箱方面对于回答这个问题至关重要。^而且我承认我在 Dropbox 中有我的开发项目懒惰 - 所以我不必记住 commit/pull 在两台不同的计算机上执行工作之间未完成的更改。但是我在 dropbox 中有这个特定项目多年,直到现在才 运行 遇到任何问题(测试 #757,即按预期执行了 756 次测试)。所以我什至没有想到 Dropbox 可能是这个问题的一个因素。我不知道同步对源设备上的文件进行了主动更改(即文件的创建位置)。