в любом случае, чтобы провалить/задержать процесс cp?

в любом случае, чтобы провалить/задержать процесс cp?

Это гипотетический сценарий. Допустим, у меня есть конкретная папка, которая синхронизируется процессом, получающим файлы/папки через интернет. Теперь, пока эта операция выполняется, ради синхронизатора не должно быть никаких операций cp в ее каталоге. В любом случае, этого можно добиться?

решение1

Существует как минимум два возможных решения:

  1. Создайте скрипт-оболочку для cp, который проверяет, выполняется ли синхронизация, либо проверяя, выполняется ли процесс, либо тестируя файл блокировки, и прерывает или откладывает операцию.
  2. Используйте 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. Однако то, что вы будете делать с этими знаниями, зависит от ситуации.

Связанный контент