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

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

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

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

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

1
2
3
4
5
6
7
#!/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/

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

1
2
3
4
5
6
7
8
9
10
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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/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/
On this page