Domanda

Un saluto tutti. Sono la creazione di un job cron per eseguire uno script bash, e sono preoccupati che il prossimo può iniziare prima che il precedente finisce. Un po 'googling rivela che un modo popolare per affrontare questo è il comando flock, utilizzato nel modo seguente:

flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
    echo "Previous script is still running!  Can't execute!"
fi

Questa grande opera. Tuttavia, che cosa devo fare se voglio controllare il codice di uscita di myscript.sh? Qualunque sia il codice di uscita che restituisce verrà sovrascritto da flock di, quindi non ho modo di sapere se è stato eseguito con successo o meno.

È stato utile?

Soluzione

Sembra che è possibile utilizzare la forma alternativa di flock, flock <fd>, dove <fd> è un descrittore di file. Se mettete questo in una subshell, e reindirizzare che descrittore di file al file di blocco, quindi flock attenderà fino a che non può scrivere quel file (o errore fuori se non è possibile aprire immediatamente e hai superato -n). È quindi possibile fare tutto quanto in vostro subshell, tra cui testare il valore di ritorno di script si eseguono:

(
  if flock -n 200
  then
    myscript.sh
    echo $?
  fi
) 200>lockfile

Altri suggerimenti

#!/bin/bash

if ! pgrep myscript.sh; then
  flock -n lockfile myscript.sh
fi

Se ho capito bene, si vuole fare in modo 'myscript.sh' non è in esecuzione prima di cron tenta di eseguire di nuovo il comando. Partendo dal presupposto che è di destra, controlliamo per vedere se pgrep è riuscito a trovare myscript.sh nella lista dei processi e in tal caso si corre di nuovo il comando gregge.

Forse qualcosa di simile potrebbe funzionare per voi.

#!/bin/bash
RETVAL=0
lockfailed()
{
        echo "cannot flock"
        exit 1
}
(
        flock -w 2 42 || lockfailed
        false
        RETVAL=$?
        echo "original retval $RETVAL"
        exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top