¿De todos modos fallar/retrasar un proceso de CP?

¿De todos modos fallar/retrasar un proceso de CP?

Este es un escenario hipotético. Digamos que tengo una carpeta en particular que está siendo sincronizada por un proceso que recibe archivos/carpetas a través de Internet. Ahora, mientras esta operación está en progreso, por el bien del sincronizador, no debería haber ninguna operación cp en su directorio. De todos modos, ¿esto se puede lograr?

Respuesta1

Hay al menos dos posibles soluciones:

  1. Cree un script contenedor para cp que verifique si la sincronización se está ejecutando, ya sea verificando si el proceso se está ejecutando o probando un archivo de bloqueo, y cancele o retrase la operación.
  2. Úselo LD_PRELOADpara conectarse writey otras llamadas.

El problema con la primera solución es que tendría que incluir todos los comandos utilizados para escribir en la carpeta, por ejemplo mv, cp, rsync, rm, ln, cat... Por otro lado, es bastante simple pero también funcionará solo para su usuario actual.

Para la segunda solución, tendría que escribir una biblioteca compartida con todas las llamadas al sistema utilizadas para cambiar/modificar el directorio, por ejemplo write, unlink, rename. Pero esta solución funcionaría con todos los ejecutables vinculados dinámicamente, por lo que no es necesario ajustar ningún otro programa.

Respuesta2

Si sabe que el proceso de sincronización se está ejecutando y sabe que la única operación posible es cp, entonces puede enviar SIGSTOPa todos los procesos una pausa en la ejecución. Una vez completada la sincronización, envía SIGCONTa todos los procesos para continuar.

Para ello, puede utilizar kill -s SIGSTOP $(pidof cp)o killall -s SIGSTOP cp. En una terminal, puede usar Ctrl+ Zpara poner en segundo plano una tarea ("pausar"). Para continuar la ejecución, utilice el fgcomando ("primer plano", consulte help fg).

Respuesta3

Su sincronizador escribe en el directorio en lugar de leer, ¿verdad? Por lo tanto, tomar una instantánea del sistema de archivos o configurar el bit inmutable está descartado.

Si está ejecutando el sincronizador como root, puede cambiar la propiedad del directorio a root y los permisos a 700 (rwx------; solo el propietario puede hacer algo). Esto mantendrá fuera cualquier proceso nuevo que no se ejecute como raíz, pero cualquier proceso que ya tenga un archivo o subdirectorio abierto aún podrá realizar cambios.

En Linux, si desea encontrar todos los procesos que actualmente tienen archivos abiertos en su árbol, puede hacerlo lsof +D my_directory. Sin embargo, lo que haga con ese conocimiento depende de la situación.

información relacionada