[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