bash: ¿cómo esperar un time para evitar la ejecución simultánea de un script?

Mi problema :

Cada noche, mi crontab inicia varias testings nocturnas en una supercomputadora que trabaja con PBS bajo CentOS 6.5. Cuando se inicia, los trabajos esperan en la queue. Cuando el planificador permite ejecutar, mis trabajos comienzan. Es bastante común que el progtwigdor inicie todos los trabajos al mismo time (incluso si mi crontab los lanzó en momentos separados).

No puedo modificar la parte principal del trabajo (pero puedo agregar cosas antes). Cada trabajo comienza con una actualización de un repository SVN común. Pero cuando los trabajos comienzan simultáneamente, tengo un error debido a las actualizaciones simultáneas en el mismo repository. Quiero evitar eso.

Lo que espero

Cuando el planificador lo lanza, el trabajo puede esperar unos segundos antes de comenzar. Una solución podría esperar un time aleatorio antes de comenzar, pero el riesgo de tener el mismo time aleatorio aumenta rápidamente con el número de testings que realizo en paralelo. Si networkinguzco este riesgo eligiendo un gran número aleatorio, tengo que esperar demasiado (bloqueando resources no utilizados en el superorderador).

Supongo que es posible almacenar la información de "Voy a lanzar ahora, otros tienen que esperar 1 minuto" para cada trabajo, de una manera segura para múltiples hilos, pero no sé cómo. Lo que imagino es una especie de mutex pero que induce solo un retraso y no un locking esperando el final.

Una solución sin MPI es preferible.

Por supuesto, estoy abierto a otras soluciones. Cualquier ayuda es bienvenida.

Llame a su script desde un contenedor que intente get primero un locking exclusivo en un file de locking. Por ejemplo

{ flock -s 200 # your script/code here } 200> /var/lock/myscript 

El nombre del file de locking realmente no importa, siempre y cuando tenga permiso de escritura para abrirlo. Cuando se ejecuta este reiniciador, primero intentará get un locking exclusivo en /var/lock/myscript . Si otro script ya tiene el locking, bloqueará hasta que el locking esté disponible.

Tenga en count que no hay times de espera arbitrarios; cada script se ejecutará tan pronto como sea posible, en el order en que primero intentan get el locking. Esto significa que también puede comenzar los trabajos simultáneamente; el sistema operativo administrará el acceso al locking y el pedido.

Aquí hay una solución usando GNU parallel

Puede parecer un poco contra-intuitivo al principio usar esta herramienta, pero si establece la cantidad máxima de trabajos para ejecutar al mismo time en 1, puede simular una queue de trabajos que ejecuta múltiples trabajos en secuencia sin superposiciones.

Puede observar el efecto deseado de este command usando este ejemplo

 seq 1 5 | parallel -j1 -k 'echo {}; sleep 1' 

-j1 establece trabajos máximos ejecutándose a la vez a 1 mientras -k conserva el order.

Para aplicar esto a su problema original, podemos crear, por ejemplo, un file que contenga una list de files de script línea por línea. Luego podemos canalizar el contenido de ese file a parallel para hacer que varios guiones se ejecuten en secuencia y en order.

 cat file | parallel -j1 -k bash {}