shell-script-pt
[Top][All Lists]
Advanced

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

RES: [shell-script] Como saber se meu shell já está executando?


From: Rodolfo Villanova
Subject: RES: [shell-script] Como saber se meu shell já está executando?
Date: Tue, 15 Mar 2005 15:57:12 -0300

Beleza, mano!

Bastante interessante o referido site e os 6 livros!
Só por isso já valeu tua contribuição!!!

Agradeço em nome do grupo!
--------------------------
Rodolfo D. Gross Villanova

> -----Mensagem original-----
> De: address@hidden [mailto:address@hidden]
> Enviada em: terça-feira, 15 de março de 2005 14:27
> Para: address@hidden
> Assunto: Re: [shell-script] Como saber se meu shell já está executando?
>
> Usando o comando ps (ou suas variantes) pra verificar se um processo
> está rodando é um tanto lento e arriscado.  Arriscado porque você pode
> ter outro processo com o mesmo nome mas que não tenha nenhuma relação
> com o seu rodando.
>
> Uma maneira bastante elegante de resolver este e outros problemas é
> implementar um MUTEX com arquivos, conforme descrito em
> <http://sbl.salk.edu/lb/doc/UNIX_CD/upt/ch45_36.htm>.
>
> (Aliás, o livro "UNIX Power Tools" é excelente.  Vale a pena comprá-lo
> ou, pelo menos, anotar o seu site nos bookmarks.)
>
> Basicamente, a solução seria a seguinte:
>
>       # Define o nome do arquivo de trava
>       LOCKFILE=/tmp/lock.myname
>
>       # Tenta obter a trava
>         if (umask 222; echo $$ >$LOCKFILE) 2>/dev/null; then
>             trap "rm -f $LOCKFILE" EXIT
>         else
>             set x `ls -l $LOCKFILE`
>             echo >&2 "Já há um processo executando pelo usuário
> $4 desde $7 $8 $9"
>             exit 1
>         fi
>
> O 'if' testa uma subshell que tenta sobrescrever o arquivo $LOCKFILE.
> Ele só vai conseguir fazer isto se o arquivo já não existir, pois, se
> ele já existir, não terá permissão para escrita devido à umask com que
> foi criado.  Se a criação for bem sucedida, programamos o comando "rm
> -f $LOCKFILE" pra ser executado ao final do script, de modo a liberar
> a trava.
>
> Se já houver um processo executando e "de posse" da trava, outros
> processos não conseguirão sobrescrever o LOCKFILE e terminarão no
> 'else' com uma mensagem.
>
> Uma vantagem desta solução é que você pode usá-la para delimitar
> regiões críticas no seu script substituindo o 'if' por um 'until' e
> executando o "rm -f $LOCKFILE" explicitamente no final da região.
>
> Outra coisa interessante é que você pode coordenar a entrada em
> regiões críticas entre scripts diferentes.  Basta acordar o nome do
> LOCKFILE.
>
> Gustavo.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]