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

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

RE: Ajuda em Bash


From: Andre Luis Arantes Monteiro
Subject: RE: Ajuda em Bash
Date: Mon, 6 Nov 2000 21:11:39 -0200

> Data: Mon, 06 Nov 2000 14:24:13 -0200
> De: Junior <address@hidden>
> Assunto: Ajuda em Bash
>
> Tenho os seguintes scripts...
> file-1.pl
> file-2.pl
> file-3.pl
> file-4.pl
> file-5.pl
> file-6.pl
> file-7.pl
> file-8.pl
>
>so que preciso desses scripts rodando sem parar entao estou tentando fazer um 
>script em bash e
> deixa-lo no cron para verificar se o servido esta rodando ou nao...

> #!/bin/bash
> for ((i=1; i<9; i++))
> do
>  x=`ps -ef | grep file-$i | grep -v grep | wc -l`;
>  if ($x eq 0) then
>    #inicia o servico   fi done; 
>o meu problema esta no if alguem pode me ajudar ???
>obs sou iniciante ok???

Olá, Junior.

Você poderia tentar um script assim:

======================Picote Aqui========================
#!/bin/bash
i=1

while [ $i -ne 9 ] ; do

   if [ `ps -ef | grep "file-$i" | grep -v "grep" | wc -l` -eq 0 ] ; then

      # Inicia o servico. *_por exemplo_*:
      /usr/local/bin/file-$i.pl

   fi

   i=`expr $i + 1`

done
======================Picote Aqui========================

Não sei como os programas em Perl estão escritos; não seria mais fácil criar um 
loop infinito
dentro do próprio script file-?.pl, que então ficaria rodando sem parar. Você 
poderia colocá-lo
para rodar em background (file-?.pl &), e quando quisesse terminá-lo, bastaria 
dar um kill -9 no
PID do processo (por exemplo, "kill -9 `pidof file-1.pl`")? É apenas uma 
sugestão, que acho que
poderia ser considerada, pois aí não haveria a necessidade de se rodar o 
processo no cron.
Como já disse, não sei como cada um destes scripts .pl foram escritos.

Outra observação: a notação que você utilizou { for ((i=1; i<9; i++)) }, entre 
outras, *se não me engano*,
é para o C-Shell (/bin/csh). O Bourne Shell (/bin/sh) e o Bourne Again Shell 
(/bin/bash) utilizam
uma notação diferente. Posso estar enganado, pois utilizo apenas o bash (em 
casa) e o sh (em
um servidor HP-UX).

Espero que tenha ajudado.

Andre Luis Arantes Monteiro
Programador
(12) 565-9551 (res)
(12) 528-4240 (com)



From (no email address) Mon Nov 06 16:49:40 2000
Return-Path: <address@hidden>
X-Sender: address@hidden
X-Apparently-To: address@hidden
Received: (EGP: mail-6_2_1); 7 Nov 2000 00:49:39 -0000
Received: (qmail 5358 invoked from network); 7 Nov 2000 00:49:39 -0000
Received: from unknown (10.1.10.142) by m2.onelist.org with QMQP; 7 Nov 2000 
00:49:39 -0000
Received: from unknown (HELO burns.conectiva) (200.250.58.146) by mta3 with 
SMTP; 7 Nov 2000 01:50:43 -0000
Received: (qmail 12264 invoked from network); 7 Nov 2000 00:46:38 -0000
Received: from verde.distro.conectiva (10.0.17.77) by burns.conectiva with 
SMTP; 7 Nov 2000 00:46:38 -0000
Date: Mon, 6 Nov 2000 22:52:33 -0200 (EST)
X-Sender: aurelio@verde.distro.conectiva
To: "'address@hidden'" <address@hidden>
Subject: Re: [shell-script] RE: Ajuda em Bash
In-Reply-To: <address@hidden>
Message-ID: <Pine.LNX.4.21.0011062250030.966-100000@verde.distro.conectiva>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-1
Content-Transfer-Encoding: 8BIT
From: # aurelio marinho jargas <address@hidden>

@ 6/11, Andre Luis Arantes Monteiro:
> > De: Junior <address@hidden>
> > #!/bin/bash
> > for ((i=1; i<9; i++))
> > do
> Outra observação: a notação que você utilizou { for ((i=1; i<9; i++)) }, 
> entre outras, *se não me engano*,
> é para o C-Shell (/bin/csh). O Bourne Shell (/bin/sh) e o Bourne Again Shell 
> (/bin/bash) utilizam
> uma notação diferente. Posso estar enganado, pois utilizo apenas o bash (em 
> casa) e o sh (em
> um servidor HP-UX).

oi andre,

no bash 2.04 rola essa sintaxe

/usr/share/doc/bash-2.04/NEWS:
f.  There are several new arithmetic operators:  id++, id-- (variable
    post-increment/decrement), ++id, --id (variabl pre-increment/decrement),
    expr1 , expr2 (comma operator).

g.  There is a new ksh-93 style arithmetic for command:
        for ((expr1 ; expr2; expr3 )); do list; done


--
s·:(·>(·×^a]×http://www.verde666.org×^[:wq


From (no email address) Mon Nov 06 17:01:11 2000
Return-Path: <address@hidden>
X-Sender: address@hidden
X-Apparently-To: address@hidden
Received: (EGP: mail-6_2_1); 7 Nov 2000 01:01:09 -0000
Received: (qmail 14879 invoked from network); 7 Nov 2000 01:01:09 -0000
Received: from unknown (10.1.10.142) by m4.onelist.org with QMQP; 7 Nov 2000 
01:01:09 -0000
Received: from unknown (HELO burns.conectiva) (200.250.58.146) by mta3 with 
SMTP; 7 Nov 2000 02:02:13 -0000
Received: (qmail 13557 invoked from network); 7 Nov 2000 00:57:57 -0000
Received: from verde.distro.conectiva (10.0.17.77) by burns.conectiva with 
SMTP; 7 Nov 2000 00:57:57 -0000
Date: Mon, 6 Nov 2000 23:03:52 -0200 (EST)
X-Sender: aurelio@verde.distro.conectiva
To: address@hidden
Subject: Re: =?ISO-8859-1?Q?[shell-script]_pegar_versão_do_bash_(was?= 
=?ISO-8859-1?Q?:_txt2regexp.sh)?In-Reply-To: 
<Pine.LNX.4.30.0011031629170.30012-100000@lilica.distro.conectiva>
Message-ID: <Pine.LNX.4.21.0011062301020.966-100000@verde.distro.conectiva>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-1
Content-Transfer-Encoding: 8BIT
From: # aurelio marinho jargas <address@hidden>

@ 3/11, Eliphas Levy Theodoro:
> # aurelio marinho jargas, @ 16:19:
> > @ 3/11, Marcos M. S. Rezende:
> > > Como que eu posso verificar a versão do meu bash?
> > prompt$ bash -version
> > GNU bash1, version 1.14.7(1)
> >
> > prompt$ bash --version
> > GNU bash, version 2.04.0(1)-release (i386-conectiva-linux-gnu)
> > Copyright 1999 Free Software Foundation, Inc.
>
> $ echo $BASH_VERSION
> 2.04.0(1)-release
> $ bash1
> $ echo $BASH_VERSION
> 1.14.7(1)
>
> aí dá pra modificar o IFS pra pegar a versão e o release:
> #!/bin/sh
> OLDIFS="$IFS"
> IFS=.
> set - $BASH_VERSION
> IFS="$OLDIFS"
> case $1 in
>   1) echo bash1;;
>   2) echo bash2;;
>   *) echo não sei...;;
> esac


beleza!
mas como o case aceita metacaracteres, nem precisa mexer no IFS:

#!/bin/sh
case $BASH_VERSION in
  1*) echo bash1;;
  2*) echo bash2;;
  *) echo não sei...;;
esac


vou botar isso no txt2regexp.sh, valeu.


--
s·:(·>(·×^a]×http://www.verde666.org×^[:wq


From (no email address) Mon Nov 06 17:06:55 2000
Return-Path: <address@hidden>
X-Sender: address@hidden
X-Apparently-To: address@hidden
Received: (EGP: mail-6_2_1); 7 Nov 2000 01:06:55 -0000
Received: (qmail 6260 invoked from network); 7 Nov 2000 01:06:55 -0000
Received: from unknown (10.1.10.26) by m4.onelist.org with QMQP; 7 Nov 2000 
01:06:55 -0000
Received: from unknown (HELO burns.conectiva) (200.250.58.146) by mta1 with 
SMTP; 7 Nov 2000 01:06:23 -0000
Received: (qmail 14110 invoked from network); 7 Nov 2000 01:02:21 -0000
Received: from verde.distro.conectiva (10.0.17.77) by burns.conectiva with 
SMTP; 7 Nov 2000 01:02:21 -0000
Date: Mon, 6 Nov 2000 23:08:17 -0200 (EST)
X-Sender: aurelio@verde.distro.conectiva
To: address@hidden
Subject: Re: [shell-script] ANUNCIO: txt2regexp.sh
In-Reply-To: <012301c04753$766ebb80$address@hidden>
Message-ID: <Pine.LNX.4.21.0011062304040.966-100000@verde.distro.conectiva>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-1
Content-Transfer-Encoding: 8BIT
From: # aurelio marinho jargas <address@hidden>

@ 5/11, Infocruz:

> Fiz o seguinte:
> rpm -qa |grep bash

também dá, mas apenas em sistemas que usam o formato de
empacotamento RPM (conectiva, red hat, suse).

outros linux como debian e slackware e ainda os unixes não usam o
RPM.

por isso é preferível usar o --version

ah! o comando acima você pode fazer simplesmente:

prompt$ rpm -q bash


> De: "Marcos M. S. Rezende" <address@hidden>
> Enviada em: Sexta-feira, 3 de Novembro de 2000 15:23
> | Como que eu posso verificar a versão do meu bash? E a propósito,
> | alguém tem um exemplo de utilização do comando dialog com
> | radio-list?



--
s·:(·>(·×^a]×http://www.verde666.org×^[:wq


From (no email address) Mon Nov 06 17:34:58 2000
Return-Path: <address@hidden>
X-Sender: address@hidden
X-Apparently-To: address@hidden
Received: (EGP: mail-6_2_1); 7 Nov 2000 01:34:57 -0000
Received: (qmail 24490 invoked from network); 7 Nov 2000 01:33:36 -0000
Received: from unknown (10.1.10.142) by m8.onelist.org with QMQP; 7 Nov 2000 
01:33:36 -0000
Received: from unknown (HELO burns.conectiva) (200.250.58.146) by mta3 with 
SMTP; 7 Nov 2000 02:34:27 -0000
Received: (qmail 16916 invoked from network); 7 Nov 2000 01:30:02 -0000
Received: from verde.distro.conectiva (10.0.17.77) by burns.conectiva with 
SMTP; 7 Nov 2000 01:30:02 -0000
Date: Mon, 6 Nov 2000 23:35:57 -0200 (EST)
X-Sender: aurelio@verde.distro.conectiva
To: address@hidden
Subject: Re: [shell-script] renomear arquivos
In-Reply-To: <4B813DAFDA55F14EA92BFABB590081A860BCCD@wtrjo081>
Message-ID: <Pine.LNX.4.21.0010271641020.940-100000@verde.distro.conectiva>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=iso-8859-1
Content-Transfer-Encoding: 8BIT
From: # aurelio marinho jargas <address@hidden>

@ 25/10, Julio Cezar Neves - DISB.O:
> > [...]
> > olha, e sed _dá_ pra fazer, mas eu aconselho outra ferramenta.
> > o próprio awk abaixo (que eu manjo nada) tá legal, curtinho.
> > [...]
> > são 5 linhas de sed.
>
> Mas qual das 3 soluções apresentadas (awk, sed ou a clássica) será a +
> veloz?

oi julio,

acho que a de sed que eu dei tende a ser a mais lenta por usar 3
comandos sed, além do while...

a sua ficou bem limpa, mas acho que a do awk ganha por ele ser
otimizado para manipulação de texto e ser chamado apenas 1 vez.

bem, já que estamos aqui... deixa eu pegar os 3 programinhas do
histórico da lista, rodar e comparar os tempos.

mmmmmmm.m....mmm.m.mmmm interessante, vejam:

o texto:
[~] cat txt
TUDO MAIUSCULO.txt
tudo minusculo.txt
tUDo dOiDo.txt
varias VARIAS varias palaVRAS.txt


os programas:
[~] cat tst.awk
#!/bin/awk -f
BEGIN {
   FS="\\ "
   OFS=""
}
{
   printf "mv \"%s\" ", $0
   for (i=1; i<NF; i++) {
      prim=substr($i,1,1)
      resto=substr($i,2)
      $i=toupper(prim)tolower(resto)
   }
   printf "\"%s\"\n", $0
}
[~] cat tst-sed.sh
#!/bin/sh
while read linha
do echo $linha |
   sed 's/^/ /;s/ \+/ /;
        y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;
        s/ \(.\)/\n \1\n/g' |
   sed '/^ /{y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;}' |
   sed ':a;$!N;s/\n//;ta;s/ //g;'"s/^/mv \"$linha\" \"/;s/$/\"/"
done
[~] cat tst.sh
#!/bin/sh
while read Linha
do
    NovaLinha    for Palavra in $Linha
    do
        NovaPalavra="`echo $Palavra|cut -c1|tr a-z A-Z``echo $Palavra|cut 
-c2-|tr A-Z a-z`"
        NovaLinha="$NovaLinha$NovaPalavra"
    done
    echo mv \"$Linha\" \"$NovaLinha\" #| cut -c2-
done


os resultados:
[~] time cat txt | ./tst.awk
mv "TUDO MAIUSCULO.txt" "TudoMAIUSCULO.txt"
mv "tudo minusculo.txt" "Tudominusculo.txt"
mv "tUDo dOiDo.txt" "TudodOiDo.txt"
mv "varias VARIAS varias palaVRAS.txt" "VariasVariasVariaspalaVRAS.txt"

real    0m0.074s
user    0m0.030s
sys     0m0.020s
[~] time cat txt | ./tst-sed.sh
mv "TUDO MAIUSCULO.txt" "TudoMaiusculo.txt"
mv "tudo minusculo.txt" "TudoMinusculo.txt"
mv "tUDo dOiDo.txt" "TudoDoido.txt"
mv "varias VARIAS varias palaVRAS.txt" "VariasVariasVariasPalavras.txt"

real    0m0.235s
user    0m0.150s
sys     0m0.050s
[~] time cat txt | ./tst.sh
mv "TUDO MAIUSCULO.txt" "TudoMaiusculo.txt"
mv "tudo minusculo.txt" "TudoMinusculo.txt"
mv "tUDo dOiDo.txt" "TudoDoido.txt"
mv "varias VARIAS varias palaVRAS.txt" "VariasVariasVariasPalavras.txt"

real    0m0.652s
user    0m0.300s
sys     0m0.300s



o awk foi BEM mais rápido, embora aqui o resultado não tenha sido o
esperado e como não manjo de awk, não pude arrumá-lo.

o sed ficou em segundo, mesmo disparando 3 processos por |

a solução somente bash demorou mais, mesmo sendo o bash o
interpretador de comandos utilizado... interessante.

um for com 2 sub-shells demora mais que 3 chamadas de sistema ao sed,
por essa eu não esperava &:)


--
s·:(·>(·×^a]×http://www.verde666.org×^[:wq




reply via email to

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