[Comm] Зеркалирование по расписанию.

Yura Kalinichenko =?iso-8859-1?q?yuk_=CE=C1_kalina=2Ein=2Eua?=
Вс Мар 22 00:57:26 MSK 2009


Vladimir Karpinsky пишет:
> Здравствуйте!
>
> Alexey Borovskoy пишет:
>> * Среда 10 декабря 2008 Vladimir Karpinsky
>>
>> --кусь--
>>
>> #!/bin/bash
>>
>> exit_handler() {
>>     trap - EXIT
>>     [ -f "$LOCK_FILE" ] && rm -f "$LOCK_FILE"
>> }
>>
>> trap exit_handler HUP PIPE INT QUIT TERM EXIT
>>
>> date> "$LOCK_FILE"
>>
>> --кусь--
>>
>> Логику дописать по вкусу
>
> Логику дописал, уже работает пару месяцев, но сегодня углядел 
> проблемы: если на скрипт, содержащий вышележащий кусок натравить kill 
> -9, то lock-файл не уничтожается. Можно ли как-то такой вариант учесть.
>
> Второй момент: я запускаю этот же скрипт второй раз при наличии 
> lock-файла, он обнаруживает lock-файл, ничего не делает и выходит с 
> ненулевым кодом. Всё казалось бы хорошо. Но: он выходит-то по команде 
> exit и автоматом убивает lock-файл, т.е. при третьем запуске скрипта 
> уже lock-файл не будет найден, и скрипт будет пытаться работать, чего 
> бы не хотелось. Не могу сообразить, как это обойти.
>
Обычно блокировки выполняются несколько другим образом. Вот пример, 
надеюсь, достаточно понятно, что ваших проблем здесь не будет:

---------------------------cut-----------------------------
USE_LOCK=yes
LOCKDIR=/tmp
LOCKFILE=test.pid
mypid=$$

test_lock() {

  LOCK_LOOP_COUNT=10
  test "$USE_LOCK" \!= "yes" && return 0
  set -o noclobber
  until echo $mypid > $LOCKDIR/$LOCKFILE ; do
     kill -0 `cat $LOCKDIR/$LOCKFILE` || rm -f $LOCKDIR/$LOCKFILE
     if [ -f  "$LOCKDIR/$LOCKFILE" ]; then
       echo "Locking ($LOCK_LOOP_COUNT)..."
       let LOCK_LOOP_COUNT--
       if [ $LOCK_LOOP_COUNT -eq 0 ]; then
          break
       else
          sleep 1
       fi
     else
       echo "Remove stalled lock"
     fi
  done
  set +o noclobber
  if [ $LOCK_LOOP_COUNT -eq 0 ]; then
     return 1
  else
     return 0
  fi
}

test_unlock() {
  test -f $LOCKDIR/$LOCKFILE -a $mypid -eq `cat $LOCKDIR/$LOCKFILE` && rm -f $LOCKDIR/$LOCKFILE
  return $?
}


---------------------------cut-----------------------------


-- 
SY, 
   Yura Kalinichenko



Подробная информация о списке рассылки community