[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Несколько вопросов вразброс



On Fri, Jul 20, 2012 at 09:28:28PM +0400, "Артём Н." wrote:
> On 20.07.2012 10:54, Stanislav Maslovski wrote:
> > On Thu, Jul 19, 2012 at 10:53:11AM +0300, Igor Chumak wrote:
> >> Защиту от запуска второй копии я делал так:
> >>
> >> if [ -f $lockfile ]
> >> then
> >>  echo "Lock file $0.lock exist!"
> >> while [ -f $lockfile ]
> >>  do
> >>    pid=`cat $lockfile`
> >>    if [ -n "$pid" ]; then
> > 
> > Скрипт мог умереть, не потерев за собой свой lockfile, а его PID - мог
> > быть занят новым процессом (каким-нибудь рефоркающимся демоном, например).
> > В результате - deadlock.
> Кстати, точно... Надо тогда проверять процесс по имени файла. Хотя, не факт, что
> имя не могло измениться (переименовали программку просто - и всё). По идее,
> остаётся только мьютекс. Ну или тот же flock.
> 
> >>         echo "pid=$pid in lockfile; our pid=$$"
> >>         if ps $pid ; then
> >>                 echo "Process exist; waiting"
> >>         else
> >>                 echo "no process with $pid; remove lockfile"
> >>                 rm -f $lockfile
> >>         fi
> >>         else
> >>                 echo "no process with $pid; remove lockfile"
> >>                 rm -f $lockfile
> >>    fi
> >>    echo "sleep 10s"; sleep 10
> >>  done
> >> fi
> > Ну и тут, строго говоря, имеет место быть race condition.
> В упор не вижу. Где?

А вот как раз перед строчкой, которую ты удалил.

То есть, там классический race между проверкой семафора и его
установкой, поскольку делается это двумя *отдельными* операциями,
а должно делаться *атомарно*.

-- 
Stanislav


Reply to: