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: Julio Cezar Neves - DATAPREVRJ
Subject: RES: [shell-script] Como saber se meu shell já está executando?
Date: Tue, 15 Mar 2005 15:36:53 -0300

Olá Gustavo,

Já fiz algo bem parecido com o que vc está propondo e me dei mal pq o
processo foi interrompido por problema de hw e o arquivo continuou
residente. Como o processo era iniciado pelo cron, ninguém se deu conta do
que estava ocorendo e qdo notamos, já havíamos perdido muita coisa.

Continuo preferindo o bom e velho ninho de pipelines, porém nas soluções que
li até agora, não concordei com nenhuma, pois sempre haverá pelo menos um $o
em execução, por isso é necessário usar a opção -c do último grep para
verificar se a qtd de $0 > 1.

[ ]s,
Julio
========================
ATENÇÃO!  Já  chegou  às
livrarias a 5º Edição de
Programação Shell  Linux
========================
:wq

| -----Mensagem original-----
| De: Gustavo Chaves [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.
| 
| 
| 
| ---------------------------------------------------------------------
| Esta lista não admite a abordagem de outras liguagens de 
| programação, como perl, C etc. Quem insistir em não seguir 
| esta regra será moderado sem prévio aviso.
| ---------------------------------------------------------------------
| Sair da lista: address@hidden
| ---------------------------------------------------------------------
| Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
 
Links do Yahoo! Grupos




 




reply via email to

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