Canalizando a saída de um script bash após redirecionar stderr [fechado]

9

por causa da maneira como meu hoster faz as coisas, tenho que usar um sistema para serviços.

Este serviço possui um arquivo de execução que ele executa e canaliza para um segundo arquivo de execução. Mas eu uso um pacote (dado) python que registra no stderr em vez de stdout e não consigo fazer o que eu quero.

Então, eu tenho um script de execução para o meu serviço:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

que é canalizado para a execução do sistema de log:

#!/bin/sh
exec multilog t ./main

Mas o pipe não conecta o stderr (como esperado). Então, depois de pesquisar no Google, acrescentei um redirecionamento à minha execução:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1

Mas isso não resolve o meu problema: minhas próprias saídas (para stdout usando pythons print) são registradas conforme o esperado. A saída stderr não está registrada.

Se eu redirecionar meu runcript modificado para dois arquivos, isso mostra que não há redirecionamento (o stderr ainda está no stderr). Como preciso modificar meu redirecionamento para funcionar?

xavor
fonte
5
exec ... 2>&1de fato junta erro padrão à saída padrão. Então, outra coisa está errada.
thrig
3
Alguma chance de o script python fechar o stderr e reabri-lo como um arquivo? Procure uma chamada dup2()no código. Alguma idéia para onde está indo a saída stderr ? Outro pensamento: talvez o arquivo de execução do seu hoster esteja redirecionando o stderr dessa maneira antes de iniciar seu código.
Edward Falk
1
Você pode absolutamente confirmar que o texto está sendo enviado ao stderr? Substitua o script por um que diga import sys; print("Hello, stderr", file=sys.stderr)para ter certeza.
rosuav
3
Realmente stderr? Tente isso exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.loge dê uma olhada nesses arquivos de log.
ingopingo
2
O que acontece se você usar o bash em vez de sh?
Luciano Andress Martini

Respostas:

0

Tente por favor:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

ou seja: exec 2>&1em uma linha separada, dizendo para redirecionar o stderr para a mesma coisa que o stdout vai (seu terminal? ou o correio se estiver em um crontab?), seguido pelo cd & exec para substituir o processo existente pelo python3.2. Observe que eu mudei para o bash em vez de sh, para uma portabilidade mais baixa, mas geralmente uma confiabilidade muito melhor. Se isso funcionar, ótimo, senão algumas pessoas mais bem informadas irão intervir. (Não tenho tempo para fazer pesquisas neste momento)

Olivier Dulac
fonte