The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как проверить, был ли уже запущен скрипт (из самого скрипта)"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Как проверить, был ли уже запущен скрипт (из самого скрипта)"  +/
Сообщение от micis email on 04-Фев-05, 06:04 
Есть скрипт, который работает по крону. Но может быть такая ситуация, что какой-то запуск скрипта будет при ещё не отработавшем "старом". Такой ситуации быть не должно.

Если в скрипте написать (под солярисом):
ps -ef | grep -v grep | grep -с "`basename $0`$"
то он показывает как раз то, что надо, однако при этом не проверишь результат. Но, если сделать так:
BN=`basename $0`
OUT=`ps -ef | grep -v grep | grep -с "${BN}$"`
echo $OUT
То получается "лишний" процесс из-за "подстановки".
Думаю, что как-то надо сюда прикрутить $PPID. Может кто подскажет?

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как проверить, был ли уже запущен скрипт (из самого скрипта)"  +/
Сообщение от allez (ok) on 04-Фев-05, 07:15 
Можно в начале работы скрипта создать lock-файл вида <имя_скрипта>.<PID_скрипта>, командой touch "`basename $0`.$$", предварительно проверив следующие условия:
1. Наличие lock-файла.
2. Наличие процесса с PID, совпадающим с указанным в имени lock-файла.

Если условие 1 ложно - значит, нет еще одного экземпляра нашего скрипта; создаем lock-файл и работаем дальше.

Если условие 1 истинно, а условие 2 ложно - значит предыдущий сеанс работы скрипта завершился аварийно и lock-файл не удален; удаляем, создаем новый, работаем дальше. (Примечание: следует в скрипт вставить перехват прерываний и в обработке оных вставить удаление lock-файла. Штатное завершение скрипта тоже можно провести через этот обработчик.)

Если истинны оба условия - значит скрипт еще работает, завершаем работу.

Вот примерно так оно и делается...

---------------------------------------------------
#!/bin/bash

trap "my_exit" 2 9 15 # Перехват сигналов и отправка их на обработку

function my_exit() {
  echo "Deleting $LOCKFILE and exiting"
  rm $LOCKFILE
  exit
}

NAME=`basename $0`
LOCKFILE=`ls ${NAME}.* 2>/dev/null`

if [ "$LOCKFILE" == "" ]; # Условие 1 ложно
then

  LOCKFILE="`basename $0`.$$"
  touch $LOCKFILE
  ls -l $LOCKFILE

elif [ "$LOCKFILE" != "" ]; # Условие 1 истинно
then

  PID=`ls $LOCKFILE | awk -F. '{print $NF}'`
  if [ "`ps -ef | grep $PID | grep -v grep`" == "" ]; # Условие 2 ложно
  then

    rm $LOCKFILE
    LOCKFILE="`basename $0`.$$"
    touch $LOCKFILE

  else

    echo "This script is still working"
    exit 1

  fi

fi

# "Рабочая" часть скрипта
while :;
do
continue
done

# Нормальное завершение работы
my_exit
-----------------------------------------------------

Только что написал и проверил. Работает.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Как проверить, был ли уже запущен скрипт (из самого скрипта)"  +/
Сообщение от Виктор Хаблученко on 05-Фев-10, 15:09 
Я делал вот так:

SCRIPTDIR="/home/jagura/temp/scripts/"

NAME=`basename $0`

BYZA=`ps -ef | grep $NAME | grep -v grep | grep -v $$ | wc -l`
echo $$
if [ "$BYZA" != 0 ];                                           # found another instance
then
    echo FOUND another instance running!
    exit
fi


-----
Простенько, и работает безотказно.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру