
Tengo un directorio para monitorear. Cuando se actualiza, ejecuto algún comando a través de incron. Cuando se copian varios archivos en este directorio, incron ejecuta varios comandos al mismo tiempo. ¿Hay alguna forma de que cuando se ejecuta un trabajo de incron, el segundo trabajo no se ejecute? he seguidoeste tutorialpara ayuda.
Respuesta1
No, incron no tiene una función de bloqueo incorporada. Si desea evitar que los trabajos se ejecuten al mismo tiempo, hágalo desde dentro del trabajo.
Si desea retrasar un trabajo hasta que los anteriores hayan finalizado, haga que se bloqueen. Puedes usar elflock
dominio. Hay ejemplos en la página de manual.
Si desea omitir un trabajo si el anterior no ha terminado, aún puede usarlo flock
, pero con un tiempo de espera de 0. Si no puede obtener el bloqueo, salga. Tenga en cuenta que esto es propenso a una condición de carrera: podría suceder que se copie un nuevo archivo justo después de que el trabajo n.° 1 haya terminado de enumerar los archivos, pero antes de que haya tenido tiempo de liberar el bloqueo, y el trabajo n.° 2 vería que el bloqueo está abierto. todavía retenido y salir sin procesar el archivo tampoco. No hay una manera fácil de resolver esa carrera.
Respuesta2
Un ejemplo de solución más simple: supongamos que 1 significa que el archivo está bloqueado (el script anterior ya se está ejecutando) y 0 significa desbloqueado (no hay ningún proceso en ejecución).
Entonces aquí está el código.
state=`cat /tmp/my_lck`
if [ "$state" -eq 1 ];then
echo "Already executing!!!"
exit
else
#Lock the file
echo 1 > /tmp/nws_lck
#Put you code here
#Unlock
echo 0 > /tmp/nws_lck
fi