C’est l’histoire d’un script shell qui a un temps d’exécution plus long que sa fréquence d’exécution (via Cron par exemple), et bien, c’est le cagadou car, les exécutions s’empilent et la machine fini par voir arriver la fin de sa vie.

L’idée est d’utiliser un lock pour éviter les exécutions parallèles. Voici un exemple (il vaut ce qu’il vaut, les puristes râleront, mais peu me chaud).

#!/bin/sh

NAME=$(basename "$0")

if [ -f /tmp/"$NAME.pid" ] &&
  ps -p $(cat /tmp/"$NAME.pid") >/dev/null 2>&1
then
   echo "Script is currently in progress..aborting..."
   exit 3
fi

trap 'rm -f /tmp/"$NAME.pid"' EXIT
echo $$ > /tmp/"$NAME.pid"

[...] # des trucs intelligents

/tmp/"$NAME.pid"

Ici je le place dans « /tmp » qui, normalement, est vidé au reboot, ça évite de se retrouver bête en cas de reboot pendant l’exécution du script car le « /tmp/ »$NAME.pid » » n’aurait pas été effacé en fin de script .

Bon, je sais, il y a des utilitaires, il y a un problème de race-condition, mais bon, ça marche dans 99% des cas.

Partager c'est la vie

Leave a Comment