Uso del comando flock en Linux para controlar la ejecución asíncrona de programas

  
 

Recientemente, a menudo necesito hacer ssh en un número de computadoras
para hacer un montón de trabajo que se necesita hacer y se puede hacer al mismo tiempo. Por ejemplo: 1. Deje el equipo remoto mientras que el paquete de actualización 2. transmisión simultánea de archivos pequeños a un equipo remoto (la mayor parte del tiempo en el autenticación SSH)

Sin embargo, después de la acción que necesitan después de confirmar el trabajo anterior se ha completado, con el fin de Continuar

he estado haciendo en el pasado: # anterior update_pkg_on_machine_1update_pkg_on_machine_2update_pkg_on_machine_3 trabajo # ... trabajo detrás

A pesar de que esto asegura que el trabajo se haya completado, al mismo tiempo, pero es muy lento y hellip;

otro método posible es: # frente de trabajo update_pkg_on_machine_1 &update_pkg_on_machine_2 &update_pkg_on_machine_3 del sueño ... el trabajo detrás de

A pesar de que de esta manera se puede trabajar al mismo tiempo, pero si 10 segundos El trabajo aún no se ha completado, y el siguiente trabajo puede ser incorrecto.

Es difícil saber cuántos segundos se puede hacer un trabajo.

Uso de flock para administrar el estado del trabajo

Solía ​​aprender el mutex cuando estaba trabajando en el sistema operativo y flock es un mutex que se puede usar en el shell. Oficial

rebaño explicación

Nos fijamos en el rebaño en el ubuntu lúcida explicación de: NAMEflock - Manejo de cerraduras de secuencias de comandos shell

SYNOPSISflock [-sxon] [-w Lockfile [-c] comando ...

flock [-sxon] [-w timeout] lockdir [-c] comando ...

flock [-sxun] [-w timeout ] utilidad fdDESCRIPTIONThis gestiona rebaño (2) cerraduras desde dentro de secuencias de comandos shell o línea thecommand
.

la primera y segunda formas envuelve la cerradura alrededor del acommand de ejecución, en una manera similar a su (1) o newgrp (1) . se bloquea archivo o directorio aspecified, que se crea (suponiendo appropriatepermissions), si no existe ya

La tercera forma es conveniente desde scripts shell, y es por lo general usedthe siguiente manera :.

(rebaño -s # 200 ... comandos ejecutados bajo llave ...) 200 > /var /lock /mylockfile

el modo utilizado para abrir el archivo del doesn ’ t asunto al rebaño, utilizando > o > > permite crear el archivo de bloqueo si aún no existe, sin embargo, se requiere permiso de escritura; utilizando < requiere que exista la filealready pero sólo se requiere el permiso leer

Por defecto, si el bloqueo no se puede adquirir de inmediato, borra waitsuntil la cerradura está disponible

OPCIONES-s, - .. -sharedObtain un bloqueo compartido, a veces llamado un bloqueo de lectura.

-x, -e, --exclusiveObtain un bloqueo exclusivo, a veces llamado un bloqueo de escritura. Thisis el valor predeterminado.

-u, --unlockDrop un bloqueo. Esto por lo general no es necesario, ya que un bloqueo isautomatically cayó cuando se cierra el archivo. sin embargo, es posible que se requiera en casos especiales, por ejemplo, si el grupo enclosedcommand puede haber un proceso de fondo en forma de horquilla, que se nodebería contiene el bloqueo .

-n, --nb, --nonblockFail (con un código de salida de 1) en lugar de esperar si el bloqueo no se puede adquirir de inmediato.

-w, --wait, - tiempo de espera secondsFail (con el código de salida 1) si el bloqueo no puede ser segundos acquiredwithin segundos. valores fraccionarios decimales están permitidos.

-o, --closeClose el descriptor de archivo en el que se lleva a cabo antes de la cerradura Comando de ejecución: es útil si el comando genera un proceso infantil que no debería estar guardando el bloqueo.

-c, --comando commandPasar un solo comando al shell con -c.

- h, --helpPrint un mensaje de ayuda

AUTHORWritten por H. Peter Anvin <. [email protected]>.

COPYRIGHTCopyright y copia; 2003-2006 H. Peter Anvin.This es libre software;. ver la fuente para condiciones de copia Hay ISNO garantía;. ni siquiera para la comercialización o adecuación para un PARTICULARPURPOSE

vER ALSOflock (2)

AVAILABILITYThe comando rebaño es parte de la util-linux -ng paquete y es availablefrom ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.

lo más destacado

a través de rebaño, el programa primero Solo se ejecuta después de intentar adquirir la propiedad de un bloqueo (que generalmente representa un archivo). La ejecución mantendrá la propiedad del bloqueo y liberará la propiedad después del final.

Herramienta de desarrollo eficiente para programadores: taza de programación herramienta de desarrollo eficiente para programadores: taza de programación

Por ejemplo, si escribimos un script de shell en $ HOME: #! /bin /bashsleep 10date

depósito y se abre en test.sh permisos de ejecución (chmod 700 test.sh) guía

en este caso si abrimos dos shell, y aproximadamente a cabo simultáneamente: /tmp/demo.lock rebaño ~ /test.sh

¿Qué sucede en este momento?

Los usuarios deben ver que ambos shells se detengan, uno esperará 10 segundos para imprimir el tiempo y uno después de 10 segundos para imprimir el tiempo:

A

wush @ enrutador: ~ $ rebaño /tmp/demo.lock ./test.shSat Ene 4 00:55:24 CST 2014B

wush @ enrutador: ~ $ rebaño /tmp/demo.lock ./test .shSat, 4 de enero, 00:55:34 CST de 2014 -

El programa A primero toma la propiedad de /tmp/demo.lock y luego ejecuta test.sh. El programa B espera hasta el final del programa A (A devuelve la propiedad de /tmp/demo.lock), y luego obtiene la propiedad de /tmp/demo.lock. Así que el programa B es naturalmente 10 segundos más lento que el programa A.

Parámetros de rebaño

Además del comportamiento predeterminado, podemos ajustar el comportamiento del rebaño a través de los parámetros. La principal diferencia del comportamiento predeterminado es que cuando la propiedad de lock_path no está disponible, la siguiente acción será diferente. 1.flock -n lock_path xxx: cuando la propiedad no está disponible, el programa se cancela directamente y xxx no se ejecuta. 2.flock -s lock_path xxx: trata a lock_path como un bloqueo compartido y puede ser propiedad de varios programas. Así que todos pueden hacerlo de inmediato, y al mismo tiempo tienen lock_path3.flock -x lock_path xxx: tratan a lock_path como un bloqueo exclusivo, y solo pueden ser propiedad de un programa.

Nota: ¡Un lock_path no puede ser compartido y exclusivo al mismo tiempo!

Resolviendo problemas en la introducción

Entonces al combinar flock, puedo realizar varios trabajos al mismo tiempo, y esperar hasta que terminen antes de continuar con el siguiente trabajo: # 前 工作 的 flock - s lock_path update_pkg_on_machine_1 &flock -s lock_path update_pkg_on_machine_2 &flock -s lock_path update_pkg_on_machine_3 &am; Xxx no coexistirá debido a la relación mutuamente exclusiva entre compartido y exclusivo. Por lo tanto, esperará hasta que finalice el trabajo anterior (devolviendo la propiedad de lock_path).

Copyright © Conocimiento de Windows All Rights Reserved