Защита скриптов от двойного запуска

Большинство администраторов используют на своих серверах скрипты, которые выполняются по крону, и время на их выполнение может увеличиваться. Возникает риск, что запущенный по крону скрипт не успеет завершиться до его повторного запуска, что создаст различные проблемы или же нагрузит сервер.

Наш скрипт (e.g. синхронизация файлов)

#!/bin/sh
 
dt=`date +%c`
 
  echo $dt
  echo "Sync /srv/www/ with node2"
  /usr/bin/rsync --numeric-ids -av --delete /srv/www/ root@node2:/srv/www/

Теперь добавим следующий код в начало нашего скрипта, для защиты от повторного запуска:

PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin"
 
if pidof -x $(basename $0) > /dev/null; then
   for p in $(pidof -x $(basename $0)); do
   if [ $p -ne $$ ]; then
   echo "Script $0 is already running: exiting"
    exit
   fi
   done
fi

В итоге получаем скрипт следующего содержания:

#!/bin/sh
 
PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin"
 
if pidof -x $(basename $0) > /dev/null; then
   for p in $(pidof -x $(basename $0)); do
   if [ $p -ne $$ ]; then
   echo "Script $0 is already running: exiting"
    exit
   fi
   done
fi
 
dt=`date +%c`
 
  echo $dt
  echo "Sync /srv/www/ with node2"
  /usr/bin/rsync --numeric-ids -av --delete /srv/www/ root@node2:/srv/www/