Curso básico Shell – #03 códigos de saída

Como faço para obter status de saída do processo que está canalizada para outro (por exemplo, ' netstat -tulpn | grep nginx') em um sistema Linux ou Unix usando um shell?

O pipe de shell é uma maneira de conectar a saída de um programa à entrada de outro programa sem nenhum arquivo temporário. A sintaxe é: [donotprint] [/ donotprint]

command1 | command2 | commandN

OU

command1 | filter_data_command > output

OU

get_data_command | verify_data_command | process_data_command | format_data_command > output.data.file

Como usar pipes para conectar programas

Use a barra vertical ( |) entre dois comandos. Neste exemplo, envie a saída do comando netstat para o comando grep, ou seja, descubra se o processo nginx sai ou não no sistema:

netstat -tulpn | grep nginx

Como obter o status de saída do processo

A sintaxe é a seguinte para obter códigos de saída de todos os comandos canalizados:

command1 | command2 
 echo  " $ {PIPESTATUS [@]} "

OU

command1 | command2 
 echo  " $ {PIPESTATUS [0]}  $ {PIPESTATUS [1]} "

PIPESTATUS é uma variável de matriz que contém uma lista de valores de status de saída dos processos no pipeline de primeiro plano executado mais recentemente. Tente os seguintes comandos:

netstat  -tulpn  |  grep nginx
 echo  " $ {PIPESTATUS [@]} "

true  |  true 
echo  "O status de saída do primeiro comando $ {PIPESTATUS [0]} e o segundo comando $ {PIPESTATUS [1]} "

true  |  false 
echo  "O status de saída do primeiro comando $ {PIPESTATUS [0]} e o segundo comando $ {PIPESTATUS [1]} "

false  |  false  |  true  
echo  "O status de saída do primeiro comando $ {PIPESTATUS [0]} , segundo comando $ {PIPESTATUS [1]} e terceiro comando $ {PIPESTATUS [2]} "

Juntando tudo

Aqui está um exemplo de script que usa $ {PIPESTATUS [0]} para descobrir o status de saída do comando mysqldump para notificar o usuário na tela sobre o status do backup do banco de dados:

#!/bin/bash
### Purpose: mysql.backup.sh : Backup database ###
### Author: Palamar. ###
### Change as per your needs ###
set -eo pipefail
MUSER='USERNAME-here'
MPASS='PASSWORD-here'
MHOST='10.0.3.100'  
DEST="/nfs42/backups/mysql"
NOWFORMAT="%m_%d_%Y_%H_%M_%S%P"
MYSQL="/usr/bin/mysql"
MYSQLDUMP="/usr/bin/mysqldump"
MKDIR="/bin/mkdir"
RM="/bin/rm"
GZIP="/bin/gzip"
DATE="/bin/date"
SED="/bin/sed"

# Falha na segurança? Criar dir #
[  ! -d "$DEST" ] && $MKDIR -p "$DEST"

# Filtro de nomes de banco de dados
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
DBS="$($SED -e 's/performance_schema//' -e 's/information_schema//' <<<$DBS)"

# Ok
for db in $DBS
do
                tTime=$(date +"${NOWFORMAT}")
                FILE="$DEST/${db}.${tTime}.gz"
                $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
                if [ ${PIPESTATUS[0]} -ne "0" ];
                then
                    echo "The command $MYSQLDUMP failed with error code ${PIPESTATUS[0]}."
                    exit 1
                else
                    echo "Database $db dump successfully."
                fi
done

Uma observação sobre o usuário zsh

Use a matriz chamada pipestatus da seguinte maneira:

true  |  echo true 
" $ {pipestatus [1]} $ {pipestatus [2]} " 

Saídas:

0 0

Conclusão - Localizando códigos de saída de todos os comandos canalizados

O status de saída de um pipeline é o status de saída do último comando no pipeline, a menos que a opção pipefail também esteja ativada. Basta adicionar o seguinte na parte superior do script do shell bash:

set -eo pipefail

Para canalizar a saída e capturar o status de saída no Bash shell, use:

data  |  grep  2018 
echo  " $ {PIPESTATUS [0]}  $ {PIPESTATUS [1]} " 
false  |  echo true 
" $ {PIPESTATUS [0]} $ {PIPESTATUS [1]} "

Curso 01 - Curso 02

Deixe uma resposta
You May Also Like