Это гипотетический сценарий. Допустим, у меня есть конкретная папка, которая синхронизируется процессом, получающим файлы/папки через интернет. Теперь, пока эта операция выполняется, ради синхронизатора не должно быть никаких операций cp в ее каталоге. В любом случае, этого можно добиться?
решение1
Существует как минимум два возможных решения:
- Создайте скрипт-оболочку для cp, который проверяет, выполняется ли синхронизация, либо проверяя, выполняется ли процесс, либо тестируя файл блокировки, и прерывает или откладывает операцию.
- Используйте
LD_PRELOAD
для соединенияwrite
и других звонков.
Проблема с первым решением заключается в том, что вам придется помещать все команды, используемые для записи, в папку, например mv
, cp
, rsync
, , rm
, ln
, cat
… С другой стороны, это довольно просто, но также будет работать только для вашего текущего пользователя.
Для второго решения вам придется написать общую библиотеку со всеми системными вызовами, используемыми для изменения/модификации каталога, например write
, unlink
, , rename
. Но это решение будет работать со всеми динамически связанными исполняемыми файлами, поэтому нет необходимости настраивать каждую другую программу.
решение2
Если вы знаете, что процесс синхронизации запущен и знаете, что единственно возможной операцией является cp
, то вы можете отправить SIGSTOP
всем процессам, чтобы приостановить выполнение. После завершения синхронизации вы отправляете SIGCONT
всем процессам, чтобы продолжить.
Для этой цели можно использовать kill -s SIGSTOP $(pidof cp)
или killall -s SIGSTOP cp
. В терминале можно использовать Ctrl+ Zдля перевода задачи в фоновый режим («пауза»). Для продолжения выполнения используйте команду fg
(«передний план», см. help fg
).
решение3
Ваш синхронизатор пишет в каталог, а не читает, верно? Так что создание снимка файловой системы или установка неизменяемого бита исключены.
Если вы запускаете синхронизатор как root, вы можете изменить владельца каталога на root и разрешения на 700 (rwx------; только владелец может делать что угодно). Это не позволит входить новым процессам, запущенным не как root, но любой процесс, у которого уже открыт файл или подкаталог, по-прежнему сможет вносить изменения.
В Linux, если вы хотите найти все процессы, которые в данный момент имеют открытые файлы в вашем дереве, вы можете сделать lsof +D my_directory
. Однако то, что вы будете делать с этими знаниями, зависит от ситуации.