Como sair do shell script com sucesso para que o subprocesso python pense que ele foi bem-sucedido? [fechadas]

1

Abaixo está meu shell script que simplesmente executa uma url como esta http://example.com:8080/beat e analisa a resposta e verifica certas condições nela. Se essa condição for atendida, saia com sucesso do script de shell usando exit 0 .

#!/bin/bash
set -e

COUNT=60 
SUM_SYNCS=0
SUM_SYNCS_BEHIND=0
HOSTNAME=$hostname  

echo $HOSTNAME

while [[ $COUNT -ge "0" ]]; do

#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)

#grep $DATA for syncs and syncs_behind
SYNCS=$(echo $DATA | grep -oE 'num_syncs: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo $DATA | grep -oE 'num_syncs_behind: [0-9]+' | awk '{print $2}')

echo $SYNCS
echo $SYNCS_BEHIND

#verify conditionals
if [[ $SYNCS -gt "8" && $SYNCS_BEHIND -eq "0" ]]; then exit 0; fi

#decrement the counter
let COUNT-=1

#wait another 10 seconds
sleep 10

done

Eu posso executar o script de shell acima do módulo de subprocesso do Python com sucesso, conforme mostrado abaixo -

proc = subprocess.Popen(shell_script, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash') 
(stdout, stderr) = proc.communicate()
if proc.returncode != 0:
    # log an error here
else:
    # success log here

Mas o que está acontecendo aqui é: se você vir meu shell script estou saindo do shell script usando exit 0 , o que é uma saída bem-sucedida, e de alguma forma em meu código Python, está registrando um erro após a execução script de shell? Significa que está indo para dentro se declaração de alguma forma.

Existe alguma maneira, posso substituir exit 0 por alguma outra chamada de saída bem-sucedida no shell script para que o script Python possa identificar isso, é uma saída bem-sucedida?

Eu não quero modificar o código do script Python.

    
por arsenal 14.03.2014 / 03:18

1 resposta

1

O problema é provavelmente o set -e :

Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !.

Assim, quase todos os comandos podem fazer o script sair com um código de saída diferente de zero.

Um problema especial que você talvez não saiba: o let COUNT-=1 tem o código de saída 1 se o resultado for 0. Ou seja, se o script não tiver executado exit 0 antes, ele deverá falhar.

Você pode resolver este problema, por exemplo com:

let COUNT-=1 || true

Mas a questão principal é, claro: o que o set -e está fazendo lá? E quem usa isso sem entender as consequências ...

    
por 14.03.2014 / 03:58