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 -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

