Programação Shell Shell pode ser standard ou restrito, na verdade sh é um comando que possibilita gerar textos com logica de programação, ele e muito utilizado para montagem de ambientes de login e abertura de novos processos que indicam nova seção. Definições Branco e TAB ou espaço são a mesma coisa. Um nome e uma sequencia de letras, digitos or underscores comecando com uma letra ou underscore. Um parametro e um nome um ditito ou algum desses caracteres: *, #, ?, -, $, e !. Comando : e uma sequencia de não brancos separados por brancos, a primeira sequencia ou argumento é o argumento 0. Pipeline : é uma sequencia de um ou mais comandos separados por | (ou, para compatibilidade histórica, pelo ^). A função de uma pipeline é sincronizar a entrada ou saida padrão para um arquivo do tipo FIFO. Uma lista : é uma sequencia de pipelines separadas por;. &, &&, or ||, e opcionalmente terminada por ; ou &. Os comandos do sh for name [ in word ... ] do list done case word in [ pattern [ | pattern ] ...) list ;; ] ... esac if list then list [ else list then list ] ... [ else list ] fi while list do list done Substituição de comandos : A saida padrão de um comando é colocada entre um par de crases (`) para ser usada como parte ou todo a palavra; novas linhas são removidas. Substituição de Parametros Caracter $ é colocado para substituir parametros. Existem dois tipos de parametros, posicional e o de palavra chave. Se parametro e um digito, então e posicional, paravras chave (tambem conhecida como variáveis) podem ter seus valores escritos. Quoting Os caracteres abaixo tem um modo especial de tratar o shell : ; & ( ) | ^ < > new-line space tab # · caracter deve ser cotado pela precedencia com um \. O par \new-line e ignorado. Todos os caracteres fechados entre o par de acentos (‘), exceto aspas simples são cotadas. · Um & no final do comando indica que este irá ser executado em background, shell mostra o numero do processo gerado. Para que você não perca este processo ao terminar seu shell, execute seu comando assim : $ nohup comando argv1 argv2 ... argvn& Prompting Quando usado interativamente, o prompt do shell e o valor da variável PS1 antes da leitura do comando. Se todo tempo uma linha deve ser digitada e uma nova linha teclada para completar o comando, entao um segundo prompt e mostrado. Input/Output Antes de um comando ser executado, sua entrada e saida pode ser redirecionada usando as notações interpretadas pelo shell. < word - Usando word como entrada padrão > word - Usando word como saida padrão >> word - Idem ao >, so que neste caso se word já existe não sobrepõe, faz o append. <&digit - Uso associado a um descritor de arquivo como entrada padrão. Similar pela saida padrão usando >&digit. Note que digit precisa ser e um tamanho entre 0 a 9. Ex: ... 2>&1 Arquivo associado ao descritor 2 com o arquivo corrente associado com o descritor do arquivo 1. Note que o redirecionamento de I/O é necessário se você quer sincronia com stdout e stderr para o mesmo arquivo. Esta opção é bastante usado para se configurar impressoras ou dispositivos seriais. Sinais As interrupções e sinais de término invocados por um comando são ignorados se este comando foi executado seguido do caracter &. Outros sinais tem valores herdados pelo shell de shells-pai, com exceção do sinal 11. (seja comando trap). Comandos especiais break [ n ] continue [ n ] cd [ arg ] echo [ arg ... ] eval [ arg ... ] exit [ n ] export [ name ... ] hash [ -r ][ name ... ] newgrp [ arg ... ] pwd read [ name ... ] return [ n ] set [ --aefhkntuvx [ arg ... ] ] shift [ n ] test times trap [ arg ] [ n ] type [ name ... ] ulimit [ -f [ n ] ] umask [ nnn ] unset [ name ... ] wait [ n ] Chamada do sh Opções podem ser especificadas como um simples or multiplo argumentos, mas em todos os casos, cada opção deve iniciar com um -. -c string - Se a chave -c está presente, então os comandos estão lendo de uma string. -s - Se a chave -s está presente, então os comandos estão lendo da entrada padrão, o shell irá de cada parametro posicional. -i - Se a entrada do shell estiver conectada a um terminal, então este shell é interativo, Neste caso TERMINATE é ignorado(então o sinal 0 não mata shell interativo). -r - Shell restrito. Sh pode retornar : 0 - Sucesso 1 - A execução do programa com erro (Veja Comandos especiais) 2 - Sintax Error 3 - Signal received that is not trapped Dicas Especiais Como ter apenas um login por usuário? # vi /usr/bin/login_unico VAR=`who | cut -c1-8 | tr -d "\040" | grep -n "^\'echo $LOGNAME\`$" |wc -l` if [ $VAR -gt 1 ] && [ $LOGNAME = "root" ] then echo MENSAGEM DE LOGIN INVALIDO sleep 10 exit fi # chmod 755 login_unico # vi /etc/profile ... ... ... /usr/bin/login_unico Como repetir os últimos comandos no Unix ? Arquivo de controle : $HOME/.sh_history Total de cmds .........: 171 (em media) Ativacao .................: set -o vi Shell responsável .....: ksh Inclua o comando de ativação no arquivo $HOME/.profile. Incluir no arquivo /etc/passwd: ... ... usuario:senha:nr_usuario:grupo:comentario:dir_trabalho:/bin/ksh Para mostrar e executar os últimos comandos tecle ESCape "k" Transferência de arquivos em redes TCP/IP (Script Shell) - Crie no /usr/bin um arquivo chamado envia e outro recebe com os seguintes conteúdos: Arquivo envia: #!/bin/sh a=$1 shift ftp -i $a > $HOME/ftp.log <<-EOF bin mput $* quit EOF Arquivo recebe: #!/bin/sh a=$1 shift ftp -i $a > $HOME/ftp.log <<-EOF bin mget $* quit EOF Troque as permissões dos arquivos para : # chmod 755 /usr/bin/envia /usr/bin/recebe # chown root /usr/bin/envia /usr/bin/recebe # chgrp root /usr/bin/envia /usr/bin/recebe Sintax : # envia machine arquivo ou # recebe machine arquivo Análise de Performance A primeira coisa a aprender sobre analise de desempenho e que não se pode medir gargalos e limitações com apenas uma variável do kernel, mesmo porquê é somente uma variável e está envolvida com outras para o processo de análise. Um dos principais programas para analise de performance e verificação da máquina é o sar. Outros programas tem papéis fundamentais, programas para tratamento de memória podem ser diferentes entre um unix e outro, isso devido a estrutura física de cada ambiente. SAR - System Activity Reporter Mesmo que seu sistema seja um SCO Unix com controle automático de tabelas o trabalho de análise e solução de problemas de performance é de propriedade do admistrador de sistemas. Diante da contínua necessidade de otimização do uso dos equipamentos, existe um processo para localização de "gargalo" de performance e sua possivel solução. A analise de performance de redes (LAN, WAN, X25, SNA etc) não fazem parte deste capítolo, mesmo porque é uma estrutura totalmente diferente. Os principais gargalos * Disco · Quando os discos estiverem mal dimencionados, ou seja, mal particionados ou mal equalizados · quando houver muito swap dinâmico(hp-ux, sco) * Memória · quando parametros do kernel estiverem mal configurados, fazendo com que os processos consumam mais do que o necessário · quando a memória RAM for insuficiênte, sistema fazendo swap Há 3 fatores principais que podem afetar drasticamente a performance da máquina, causando os gargalos descritos acima: . Hardware - se a CPU é adequada à operação . sistema operacional - se ele esta configurado apropriadamente para o ambiente. . aplicação - se a palicação está desenhada para processamento eficiente e facilidade de utilização Para obter dados sobre o tipo de problema que esta ocorrendo na máquina, deve-se disparar esse processo e deixa-lo rodando por pelo menos 2 dias. A partir disso deve-se gerar relatórios sobre o que foi acumulado anteriormente. Pa um melhor resultado da análise, procure não disparar processos que não sejam de execução rotineira, pois poderia trazer divergência no levantamento que está sendo feito, ou seja, perder-se-ia o foco do problema. Você pode usar o SAR de duas formas: 1. sar < opções> -f /usr/amd/as/saDD (onde DD e o dia dos mês) Essa opção permite a você coletar dados a partir dos relatórios gerados durante operação normal. OBS: saDD é o nome do arquivo que é gerado a partir da data que você disparou o SAR, sende que DD é o dia do mês. Por exemplo: supondo que hoje é dia 23 e você disparou o SAR no dia 10 desse mês, mas quer o relatório do dia 12, você utiliza o arquivo /usr/adm/as/sa12. Sar x y onde x é o intervalo em segundos de uma linha para outra y é quantas vezes (quantas linhas) Pois bem vamos agora ao sar e seus "resultados" aos quais deveremos ter atenção, o sar nos mostra varias opções, mas veremos em detalhes somente aquelas envolvidas diretamente na analise de performance. sar -u utilização de CPU %usr - % de tempo gasto em "user mode" %sys - % de tempo gasto em "system mode" %wio - % de tempo esperando por I/O %idle - % de tempo que a CPU não ficou fazendo nada Valores : · quanto mais %idle próximo de 0 = CPU carregada · se %wio > 7 = gargalo de disco (veja na versão do seu Unix o valor desta variável. · se %sys muito alto = analizar · se %usr muito alto = gargalo de cpu por aplicação sar -d Atividade de disco (dispositivo a bloco) · %busy - % de tempo que o dispositivo está servindo, fazendo transferência · avwait - média em milissegundos que os pedidos ficam esperando na fila · avserv - média em milissegundos que os pedidos estão sendo servidos (inclui seek, latência e tempo de transferência) Valores : %busy deve ser < 50% avserv deve ser > avwait sar -b - atividade de buffer %rcache deve ser > 90% - % de leitura da cache sar -w - atividade de swap swpot/s não deve ser > 0 - numero de processos swapped out por segundo sar -q - tamanho das filas quanto menores os valores melhor, porém se runq-sq > 4 ou %swpocc > 5 então deve-se checar mais dados através do "sar -w". sar -c - System Calls scall/s < 1000 (cuidado não tome isso como uma regra geral) - nº de system calls por seg fork/s = 0 - nº de forks por segundo exec/s = 0 - nº de execs por segundo sar -v tabelas de sistema se ov = 0 não estourou nenhuma tabela Ativação do sar e geração de relatórios Paratermos dados suficientes para uma análise mais apurada, devemos ativar esse processo e deixar rodando por mais ou menos 2 dias. 1. No arquivo /etc/rc, adicionar a seguinte linha: /usr/lib/as/sadc /usr/adm/as/as`date +%d` 2. Crie no diretório /usr/adm o subdiretório "as"(se já não existir) 3. Execute os seguintes comandos (como usuário root) # cd /usr/spool/cron/crontabs # vi root (adicione as seguintes linhas) 0 * * * 0-6 /usr/lib/as/sa1 5 18 * * 1-5 /usr/lib/as/sa2 -s 8:00 -e 18:01 -i 3600 -A obs Se você tem o costume de ligar a máquina antes ou após às 8h, voce deve alterar o parametro "-s" do comando acima para o seu horário; se você tem o consume de desligar a máquina antes das 18h01, você deve alterar o parâmetro "-e" do comando acima também para o seu horário. Se você não alterar os relatórios de acordo com sua realidade, eles podem não ser gerados. 4. Apos o reset da máquina, o SAR será ativado automaticamente e você o deixará assim por dois dias. Após a coleta dos relatórios, execute os seguintes comandos em uma área temporária. # mkdir /usr/tmp/sar_tmp # cd /usr/tmp/sar_tmp # sar -u -s 7:00 -e 20:00 -f /usr/amd/as/saDD > saru # sar -d -s 7:00 -e 20:00 -f /usr/amd/as/saDD > sard # sar -w -s 7:00 -e 20:00 -f /usr/amd/as/saDD > sarw # sar -b -s 7:00 -e 20:00 -f /usr/amd/as/saDD > sarb # sar -q -s 7:00 -e 20:00 -f /usr/amd/as/saDD > sarq # sar -c -s 7:00 -e 20:00 -f /usr/amd/as/saDD > sarc # sar -y -s 7:00 -e 20:00 -f /usr/amd/as/saDD > sary Outros comandos para análise de performance # ps -elf Esse comando é muito últil para verificar-mos se não há número exessivo de processos rodando na máquina, e para calcularmos a memória sendo utilizada. # who É bom termos em mente quantos usuários estão logados e quais esão ociosos etc. # bdf espaço em disco # dmesg mostra como esta configurado seu sistema atualmente # vmstat Para visualizar o uso da memória Comunicação Poderemos abordar varios tópicos nesta área, o ideal é que sejam separados os ítens RS232C onde se pode comunicar com qualquer outro meio, TCP/IP, UUCP, LAN, WAN, e seus protocolos os mais usados, comuns e complexos. Trocar experiências, afinal estou aqui para aprender também. Todos os tipos de protocolos podem ser abordados, inclusive Kermit o qual estou com uma pagina especial, um programa de domínio público até a versão DOS, para Win95 não, recursos como telnet remoto e local com facilidade e transparência. Multiplos protocolos e seções É transparente o ambiente que roda, e muito mais está nesta página, você poderá ter nas mãos os fontes para Unix deste programa. klingon@persogo.com.br Ao remeter E-Mail favor mencionar qual o equipamento (SCO Unix, hp-ux, linux, etc ..) Unix está sendo referenciado. Como é uma página ainda em contrução, gostaria que críticas contrutivas chegassem para aprimorar este trabalho. UUCP Quando ligamos dois ou mais computadores usando UUCP, temos que identificar qual deles são mestres e quais são escravos. Sim no UUCP você mantem somente uma linha de ida, sempre o mestre chama o escravo e não ao contrário. Para isso seguiremos os seguintes passos. Configurando o Mestre Arquivo : /usr/lib/uucp/Systems ESCRAVO Any ESCRAVO 9600 - "" @ ogin:-@ogin:BREAK-ogin:-BREAK-ogin: uucp word a Arquivo : /usr/lib/uucp/Devices ESCRAVO tty1p2 - 9600 direct(ou dial... se por linha discada) Arquivo : /usr/lib/uucp/Permissions MACHINE=ESCRAVO COMMAND=rmail:rnews:uucsp \ READ=/usr/spool/uucppublic:/tmp READ=/usr/spool/uucppublic:/tmp \ SENDFILE=yes REQUEST=yes Note que as contrabarras do arquivo Devices devem conter se você mudar de linha ou então coloque todos os comandos na mesma linha. No arquivo inittab retire qualquer identificação com a porta, se caso tenha uma linha de configuração, então coloque-a em "off". Configurando o Escravo Arquivo : /usr/lib/uucp/Systems MESTRE Any Arquivo : /usr/lib/uucp/Permissions MACHINE=ESCRAVO COMMAND=rmail:rnews:uucsp \ READ=/usr/spool/uucppublic:/tmp READ=/usr/spool/uucppublic:/tmp \ SENDFILE=yes REQUEST=yes Escolha uma tabela adequada para sua inittab, o comando getty deve ter uma tabela que tenha os parametros CS8 e -PARENB. Faça os teste de comunicação usando os comandos do UUCP # cu ESCRAVO # uucp arquivo ESCRAVO!/tmp # uucp -r arquivo MESTRE!/tmp # uusub -cESCRAVO # uucico -r1 -x7 -sESCRAVO