суббота, 14 ноября 2009 г.

Запрет запуска второй копии скрипта

Пример кода с пояснениями

#!/bin/sh

pid_file=/tmp/script-name.pid

#########################
# Создаем файл с правом только на чтение
# и вписываем туда идентификатор процесса (pid)
umask 333
(echo $$ > "$pid_file") 2>/dev/null

#########################
# Если процесс уже запущен, то попытка записи pid
# в файл будет завершена с ошибкой
if [ $? -ne 0 ]
then
umask 22

echo "Already started :("
exit 1
fi

umask 22
#########################
# Что-то долго делаем...
#########################

#########################
# Удаляем файл с pid
rm -f "$pid_file"

9 комментариев:

Roman комментирует...

А если скрипт умрёт не выполнив rm? Вы pid в файл пишете, но нигде не проверяете что процесс с таким пидом жив.

Unknown комментирует...

вы правы, но лучше такая проверка, чем совсем никакой.

Князь комментирует...

Проверку существования процесса можно организовать таким образом
if [ -z "$(ps -p $(cat "$pid_file") -o pid=)" ]
then
# Код выполняемый, если
# процесс с сохраненным pid
# не обнаружен
fi

DOMr комментирует...

Я делаю так:
if [ "`ps -ef | grep -v grep | grep "$app"`" == "" ]; then
echo "$app не запущен"
else
echo "$app запущен"
fi

DOMr комментирует...

А для данной задачи лучше будет так :)

if [ -n "`ps -ef | grep -v grep | grep "$app"`" ]; then
echo "$app уже запущен"
exit 0
fi

Князь комментирует...

grep'ов много :)

Unknown комментирует...

Проверку существования процесса по пиду

[ -d "/proc/$pid" ] && echo Yes || echo No

DOMr комментирует...

Сколько админов, столько и путей решения =)

Князь комментирует...

/proc тоже не везде бывает :)