Пример кода с пояснениями
#!/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 комментариев:
А если скрипт умрёт не выполнив rm? Вы pid в файл пишете, но нигде не проверяете что процесс с таким пидом жив.
вы правы, но лучше такая проверка, чем совсем никакой.
Проверку существования процесса можно организовать таким образом
if [ -z "$(ps -p $(cat "$pid_file") -o pid=)" ]
then
# Код выполняемый, если
# процесс с сохраненным pid
# не обнаружен
fi
Я делаю так:
if [ "`ps -ef | grep -v grep | grep "$app"`" == "" ]; then
echo "$app не запущен"
else
echo "$app запущен"
fi
А для данной задачи лучше будет так :)
if [ -n "`ps -ef | grep -v grep | grep "$app"`" ]; then
echo "$app уже запущен"
exit 0
fi
grep'ов много :)
Проверку существования процесса по пиду
[ -d "/proc/$pid" ] && echo Yes || echo No
Сколько админов, столько и путей решения =)
/proc тоже не везде бывает :)
Отправить комментарий