
Estoy intentando escribir dos guiones. Pero tengo problemas cuando intento evitar que cualquiera de ellos se ejecute dos veces seguidas. Por ejemplo, tengo script1 y script2. Quiero poder ejecutar script1 si y solo si se ejecutó script2 desde la última vez que ejecuté script1. ¿algunas ideas?
Respuesta1
En el script A, mire si existe un determinado archivo y, si no, toque un archivo en el directorio /tmp (por ejemplo touch /tmp/script.lock
:) y ejecute el código. Luego, en el script B, verifique si el archivo existe. Si el archivo existe, ejecute el cuerpo del script y luego elimine el archivo.
Guión A:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
Guión B:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
Respuesta2
Haga que cada script verifique un archivo determinado (por ejemplo /var/tmp/script1-2
).
Si el archivo de verificación no existe, escriba el nombre del otro script en el archivo lo antes posible para evitar que se ejecute mientras se ejecuta este script.
Si existe y contiene su propio nombre, salga. De lo contrario, ejecute normalmente.
Justo antes de salir, cada script debe escribir su propio nombre en el archivo.
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
Las grep
opciones son:
-q
para silencio, no produce salida-w
solo para unir palabras completas-F
para hacer coincidir cadenas fijas, no expresiones regulares.
Nota: si ambos scripts se ejecutan enexactamenteal mismo tiempo y $CHECKFILE aún no existe, ambos se ejecutarán. Cualquiera que termine último (toma más tiempo para ejecutarse) terminará con su nombre escrito en $CHECKFILE. Para evitar esto, ejecute echo script2 > /var/tmp/script1-2
antes de ejecutar cualquiera de ellos.
Respuesta3
Una opción podría ser ejecutar el comando "fecha" dentro del script 1 y redirigir esta salida a algún archivo, por ejemplo "file.txt", y luego el script 2 puede leer este "file.txt" y hacer una comparación de "fecha" entre este ¿Fecha y fecha en la que se ejecutó el script 2? Las comparaciones de "fechas" deberían ser relativamente fáciles de hacer: hay muchos ejemplos en la web (creo). Comida para el pensamiento.
Otra opción (dependiendo de sus necesidades) es, por supuesto, agregar entradas de trabajo "cron".
Respuesta4
Si solo desea saber si script2 se ejecutó antes, haga esto:
En script2 haz cualquier lugar:
touch .ran_already
.
Ahora en script1 haz:
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
Esto te servirá bien, aunque es rápido y sucio.