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: