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]} "