Что вызывает асинхронное изменение разрешений после использования chmod в обратных кавычках в Perl

TL;DR — Перейдите к ОБНОВЛЕНИЮ для игрушечного примера. Ниже был мой первоначальный вопрос, прежде чем я смог воспроизвести проблему в небольшом примере, отредактированном для ясности.

Я не понимаю, что здесь происходит. Я рвал на себе волосы, пытаясь понять, почему тест, который я написал на Perl, продолжает терпеть неудачу.

Я тестировал функцию, которая отключает ведение журнала при сбое открытия выходного файла журнала, чтобы вывод в STDERR не подавлялся. Чтобы проверить, работает ли это, я создал файл на лету и сделал его недоступным для записи с помощью chmod. Результирующий запуск кода должен вывести ошибку открытия вместе со всеми остальными 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% случаев! Вот что заставило меня подумать, что в этой проблеме может быть какая-то асинхронность, которую я не мог объяснить, потому что я думал, что обратные кавычки, по сути, ждали завершения процесса, поскольку он возвращает вывод - так что здесь происходит? Я этого не понимаю.

Для полноты фактическая тестовая команда также выполняется в обратных кавычках — она запускает независимый скрипт.

В моем обновлении ниже я показываю другой случай, но он демонстрирует случайность состояний разрешений...

ОБНОВИТЬ

ХОРОШО. Это небольшой автономный пример, демонстрирующий проблему. Обратите внимание на разные выходные данные второй строки в каждом случае...

удалитьme1.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`;

удалитьme2.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

Вот пример, более верный для моего конкретного случая.

удалитьme3.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");

удалитьme4.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.


person hepcat72    schedule 31.05.2020    source источник
comment
Никаких исследований? Я потратил на это часы и использую perl уже 20 лет. А кто минусует, не комментируя? Предполагается, что обратные кавычки ждут, пока команда не будет выполнена: выполняет команду, и ваш сценарий perl продолжается после завершения команды. fibrevillage.com/ скрипт/   -  person hepcat72    schedule 31.05.2020
comment
Re Я думал, что обратные кавычки, по сути, ждали завершения процесса, поскольку он возвращает результат. Так оно и есть. Вышеприведенное выполняет /bin/sh с аргументами /bin/sh, -c и echo > file.log;chmod 444 file.log;ls -halF file.log. Он ожидает возврата sh, прежде чем продолжить. Как вы сказали, это необходимо, так как он собирает вывод ребенка. Это отвечает на ваш вопрос? Если нет, то я не знаю, что это такое.   -  person ikegami    schedule 31.05.2020
comment
Так почему же случайные сбои теста для ожидаемых ошибок прав доступа к файлу, которые исправляются с помощью команды Perl chmod?   -  person hepcat72    schedule 31.05.2020
comment
Тест состоял в том, чтобы установить флаг ведения журнала, когда открытие для записи не удалось, чтобы вывод поступал в stderr, но на самом деле файл записывался. Открытие должно завершиться ошибкой из-за проблемы с разрешениями и соответствующим образом установить флаг ведения журнала.   -  person hepcat72    schedule 31.05.2020
comment
Невозможно сказать, почему тест терпит неудачу, поскольку вы показываете только ту часть, которую считаете важной, но которая на самом деле может быть не важной частью или не всем, что важно. См. Как создать минимальный воспроизводимый пример.   -  person Steffen Ullrich    schedule 31.05.2020
comment
Да, я знаю, что open завершается с ошибкой прав доступа @ikegami, но, как я уже сказал, первая строка кода в моем запуске фактического тестового кода говорила, что у владельца есть разрешение на запись. ls -l в строке над вызовом этого скрипта написано r--. Я делаю ls -l в инициализации первого используемого модуля в запущенном скрипте, и он говорит rw-. Так что я даже не уверен, как бы я воспроизвел это. Модуль большой. Позвольте мне посмотреть, смогу ли я воспроизвести его в уменьшенной версии, но я не уверен, как это сделать.   -  person hepcat72    schedule 01.06.2020
comment
Я не могу поверить, что мне удалось создать воспроизводимый пример, но взгляните на обновление для окончательного доказательства того, что мой инстинкт был прав. ЧТО-ТО происходит асинхронно.   -  person hepcat72    schedule 01.06.2020
comment
Спасибо за тестовый фрагмент. Этого не должно происходить (если только что-то активно не меняет разрешения) X_X. Не удается реплицировать в Linux и Linux через WSL.   -  person ikegami    schedule 01.06.2020
comment
Я предполагаю, что асинхронная вещь, которую вы видите, может быть графическим интерфейсом macOS, но вы только мимоходом упомянули Mac. Похоже, что во всех неудачных случаях были добавлены расширенные атрибуты, поэтому что-то о Mac (Spotlight и т. д.) могло посетить, когда эта версия файла существовала. Но почему вы раскошеливались на эти вещи? Что произойдет, если вы сделаете то же самое из сценария оболочки?   -  person brian d foy    schedule 01.06.2020
comment
› «Вы упоминаете Mac только вскользь». - Какова твоя точка зрения? Что ты пытаешься этим сказать? › «Почему вы раскошеливались на эти вещи?» - Это не относится к моему вопросу. У меня есть решение этой проблемы. Единственная причина, по которой я задаю этот вопрос, состоит в том, чтобы понять, что происходит в данном случае. › «Что произойдет, если вы сделаете то же самое из сценария оболочки?» - Хорошо, так что, если сценарий оболочки не делает этого, вы предполагаете, что это исключает Perl? Я не думаю, что это было бы важно, учитывая, насколько разительной кажется разница в моем реальном тесте (который, кажется, попал в золотую середину) и в моем игрушечном примере.   -  person hepcat72    schedule 01.06.2020
comment
Редактирование моего предыдущего комментария: если сценарий оболочки *делает это сделать   -  person hepcat72    schedule 01.06.2020
comment
@Steffen Ullrich - Да, я знаю (/ знал), что это невозможно. Я был просто в недоумении, и я надеялся, что мне не хватало какого-то очевидного ответа об асинхронности операций разрешений и о том, что выполнение этого в обратных кавычках обычно избегалось по неизвестной причине X. Я должен был понять, что те, кто здесь, просто предположили бы, что я закодировал что-то не так, потому что это не имеет смысла. Я, вероятно, пришел бы к тому же выводу, если бы читал свой собственный вопрос, но в то же время я знал, что мой код не несет ответственности, поэтому, похоже, не было способа доказать это, потому что вы не можете доказать отрицательное.   -  person hepcat72    schedule 01.06.2020
comment
Возможно, этот вопрос следует вместо этого задать сбою сервера или суперпользователю? Достаточно ли доказательств того, что это не проблема с кодом? На самом деле, может ли это быть буквально проблемой переполнения или даже уязвимостью системы безопасности? Я должен попытаться запустить свой тест в каталоге, в котором нет более 45 000 файлов.   -  person hepcat72    schedule 01.06.2020
comment
Если вы хотите активно сопротивляться помощи, то почему вы задаете вопрос?   -  person brian d foy    schedule 02.06.2020
comment
Меня просто раздражали отрицательные голоса и ехидные комментарии, в которых не было каких-либо полезных предложений о том, что искать, когда я понятия не имел, куда идти или что вообще имело значение. Я уже был расстроен тем, что большую часть дня сходил с ума, пытаясь понять это самостоятельно. Поэтому прошу прощения, что я был резок с вами. - Как вы думаете, почему, попробовав это в сценарии оболочки, я приблизился бы к пониманию того, что происходит в коде Perl? Похоже, положительный или отрицательный результат изменения разрешений WRT будет неубедительным.   -  person hepcat72    schedule 02.06.2020
comment
Я попробовал этот пример на своем новом ноутбуке (под управлением Catalina) (в таком же большом каталоге) и не смог воспроизвести случайную проблему. Я также повторил попытку на ноутбуке Sierra как в большом каталоге, так и в маленьком каталоге, и оба раза воспроизвел проблему.   -  person hepcat72    schedule 02.06.2020


Ответы (1)


Я выяснил виновника асинхронных изменений разрешений. В моем вопросе мне не хватало важной информации: каталог, в котором я работал, находился в 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. Я перезагрузился в режиме восстановления и отключил SIP с помощью csrutil disable. После перезагрузки я запустил тестовый цикл и увидел такое же поведение случайного изменения разрешений, но во время его работы я получил диалоговое окно из Dropbox, в котором говорилось: «Dropbox необходимо изменить разрешения для папки /Users/robleach/Dropbox». Я нажал OK и повторно запустил цикл, и проблема случайных разрешений не была очевидна.

Я перезагрузился в режиме восстановления, чтобы снова включить SIP, и снова перезагрузился (с активным SIP), просто чтобы подтвердить, что SIP не задействован. Я повторно запустил цикл и снова увидел проблему со случайными разрешениями. Затем я вышел из Dropbox и повторно запустил цикл. Результаты выше.

Я открыто признаю, что мне не хватало знаний, чтобы мне даже в голову пришло осознать, что аспект этой проблемы, связанный с Dropbox, будет иметь решающее значение для ответа на этот вопрос. не нужно помнить о фиксации/вытягивании незавершенных изменений между выполнением работы на 2 разных компьютерах. Но у меня был этот конкретный проект в Dropbox в течение многих лет, и до сих пор я никогда не сталкивался с какими-либо проблемами (тест № 757, то есть 756 тестов, выполненных, как и ожидалось). Так что мне даже не приходило в голову, что Dropbox может быть фактором в этой проблеме. Я не знал, что синхронизация внесла активные изменения в файлы на исходном устройстве (то есть там, где был создан файл).

^ Перекрестная ссылка: https://meta.stackexchange.com/questions/348841/stack-mechanisms-are-evolving-toward-an-ideal-that-hampers-collaborative-problem

person hepcat72    schedule 02.06.2020
comment
Да, я подозревал, что что-то в этом роде. Dropbox любит менять значок синхронизируемого файла, поэтому вы получаете права на запись и расширенные атрибуты. Но именно поэтому мы задаем уточняющие вопросы. - person brian d foy; 03.06.2020
comment
И SIP делает намного меньше, чем люди думают. Вы не сможете создавать файлы в каталоге, защищенном SIP. Ничего страшного, но я заметил в своих поисках помощи, что разные люди быстро переходят к отключению SIP, когда вы пытались отключить и снова включить подход. - person brian d foy; 03.06.2020
comment
Это хороший момент по поводу изменения значков. Я только недавно открыл для себя SIP. Это было причиной проблемы, когда я столкнулся с ошибкой в ​​​​приложении, которая добавила флажок карантина. На самом деле, я забыл, что собирался ответить на этот вопрос. Я начал, но две ссылки, где я обнаружил документацию по ошибке, нуждались в дополнительной проверке. Потом я отвлекся и забыл об этом. Я пытался отключить его, когда мой Mac Mini зависал и имел не отвечающий процесс под названием SandboxedServiceRunner, но зависания продолжались, несмотря на отключение, поэтому я подозреваю, что вы в целом правы. - person hepcat72; 03.06.2020