Системный вызов mkdir()
является атомарным в файловых системах POSIX. Так, использование mkdir
команда таким способом, к которому это включает точно один вызов mkdir()
достиг бы Вашей цели. (IOW, не использовать mkdir -p
). Соответствие разблокировало, rmdir
конечно.
Принцип "качество на риск покупателя": mkdir()
не могло бы быть атомарным в сетевых файловых системах.
Когда Вы пытаетесь изменить время изменения файла с touch
, или в более общем плане с базовым системным вызовом utime
, существует два случая.
--omit-dir-times
(-O
).Это все имеет отношение к включению разработки PHP в сценарии единственного разработчика (т.е.: без SCM).
Хорошо, остановитесь тут же. Просто, потому что существует единственный разработчик, не означает, что Вы не должны использовать SCM. Необходимо использовать SCM. Сделайте, чтобы разработчик зарегистрировался в файле и дал ему способ нажать “развернуть” кнопку для проверки файлов от SCM в живой каталог.
Нет абсолютно никакой технической причины, почему Вы не должны использовать SCM, но может быть человеческая причина. Если человек, работающий над этими файлами, разрабатывает себя “разработчик”, он должен использовать SCM. Но если это - нетехнический человек, продвигающий документы в, SCM мог бы быть слишком сложным. Поэтому продолжите продвигать файлы по FTP или SSH. Существует три способа, которыми это может работать.
rsync
имеет опцию не синхронизировать времена. Scp не делает, если Вы не говорите его. Я не знаю WinSCP, но он, вероятно, может также.apache
пользователь, затем обычный подход должен был бы предоставить пользователю доступ SSH как apache
. Свободный доступ должен сделать, чтобы пользователь создал закрытый ключ SSH и добавил соответствующий открытый ключ к ~apache/.ssh/authorized_keys
. Это означает, что пользователь сможет выполнить произвольные команды как apache
пользователь. Так как Вы соглашаетесь с предоставлением пользователя sudo права так или иначе, оно не имеет значения в Вашем случае. Это возможно, но не так легко, для помещения большего количества ограничений (Вам нужна запись базы данных отдельного пользователя с другим именем, тем же идентификатором пользователя, ограниченной оболочкой и chroot тюрьмой; детали в отдельном вопросе, хотя это может уже быть покрыто на этом сайте или на Отказе сервера).¹ Или, для пустого файла, пишут байт и затем усекают.
² Запрет дополнительных сложностей, но ни один, о чем я знаю, не применяется здесь.
Можно установить rsync для использования sudo на удаленном конце как это:
rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
sudo rsync
является очень трудным ограничить. Я только предложил это, потому что OP сказал, что у пользователя уже был sudo доступ.
– Caleb
15.06.2011, 12:29
apache
— затем они смогли бы установить времена. См. мой пересмотренный ответ для правильного решения и нескольких субоптимальных. – Gilles 'SO- stop being evil' 16.06.2011, 10:26