¿Cómo prevenir múltiples instancias de un script?

Tengo scripts PHP que tengo que ejecutar en Linux, así como en los servidores de Windows. Quiero usar los mismos scripts sin hacer ninguna modificación para esos 2 entornos.

Estos scripts se programarán con cron (en linux) y con el programador de windows (u otro, no me importa ahora) para mi entorno Windows.

Sin embargo, algunos de estos scripts pueden tardar varios minutos en completarse. Solo quiero evitar que el programador (cron o el de Windows) inicie la misma secuencia de comandos antes de que finalice la última vez que se lanzó.

No estoy seguro de cómo hacerlo. Quiero asegurarme de que se libere el "bloqueo" si algo sale mal durante la ejecución, por lo que se lanzará de nuevo la próxima vez sin intervención humana.

Tal vez con un rebaño en un archivo ficticio haría el truco, pero no estoy seguro de cómo hacerlo.

También tengo una base de datos MySQL en estos servidores. Pensé que tal vez usar un bloqueo en el lado de la base de datos.

1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;

Si el nombre del script está en la tabla, entonces podría evitar que se ejecute. Si la ejecución del script falla, Mysql revertirá automáticamente la transacción para que la fila no aparezca la próxima vez que se llame al script.

Pero, en una transacción, ¿hay alguna forma para que otras conexiones vean los datos no confirmados? Si es así, ¿cómo?

También pensé en usar un candado en la fila si es imposible usar el rollo de retroceso ...

1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).

Pero mi mayor problema aquí es con Mysql. Seleccione ENCENDIDO PARA ACTUALIZAR hasta que se libere el bloqueo anterior o si transcurren los 50 segundos de tiempo de espera (variable innodb_lock_wait_timeout). Me gustaría que Mysql me dijera en el momento que mi fila está bloqueada sin afectar a toda la base de datos. Esto se debe a que la variable innodb_lock_wait_timeout es global (no de sesión). ¿Hay otra variable que imite la cláusula NO_WAIT que está disponible en Oracle?

¿O debo dejar que el script cuelgue 50 segundos sin ningún problema?

Cuál es el mejor enfoque al respecto, ya que soy un novato de php y no quiero causar ningún problema en el servidor.

Tal vez tengo otra opción que no vi ...

Respuestas a la pregunta(5)

Su respuesta a la pregunta