URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3913
[ Назад ]

Исходное сообщение
"Как проверить, был ли уже запущен скрипт (из самого скрипта)"

Отправлено micis , 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. Может кто подскажет?


Содержание

Сообщения в этом обсуждении
"Как проверить, был ли уже запущен скрипт (из самого скрипта)"
Отправлено allez , 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
-----------------------------------------------------

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


"Как проверить, был ли уже запущен скрипт (из самого скрипта)"
Отправлено Виктор Хаблученко , 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


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