Piping dell'output di uno script bash dopo il reindirizzamento di stderr [chiuso]


9

a causa del modo in cui il mio hoster fa le cose, devo usare un sistema per i servizi.

Questo servizio ha un file di esecuzione che esegue e convoglia in un secondo file di esecuzione. Ma io uso un pacchetto (dato) di Python che accede a stderr invece di stdout e non riesco a farlo fare quello che voglio.

Quindi ho uno script di esecuzione per il mio servizio:

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

che viene convogliato nell'esecuzione del sistema di registrazione:

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

Ma la pipe non collega stderr (come previsto). Quindi dopo aver cercato su Google ho aggiunto un reindirizzamento alla mia corsa:

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

Ma questo non risolve il mio problema: i miei output (su stdout usando pythons print) vengono registrati come previsto. L'output stderr non è registrato.

Se reindirizzo il mio runscript modificato in due file, questo mostra che non c'è reindirizzamento (stderr è ancora su stderr). Come devo modificare il mio reindirizzamento per funzionare?


5
exec ... 2>&1unisce effettivamente l'errore standard allo standard out. Quindi qualcos'altro è sbagliato.
thrig

3
Qualche possibilità che lo script Python chiuda stderr e lo riapri come file? Cerca una chiamata a dup2()nel codice. Qualche idea su dove stia andando l'output di stderr ? Un altro pensiero: forse il file di esecuzione del tuo hoster sta reindirizzando stderr in questo modo prima di iniziare il tuo codice.
Edward Falk,

1
Puoi assolutamente confermare che il testo è stato inviato a stderr? Sostituisci lo script con uno che dice import sys; print("Hello, stderr", file=sys.stderr)di essere sicuro.
rosuav,

3
Davvero stderr? Prova questo exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.loge dai un'occhiata a questi file di registro.
Ingopingo,

2
Cosa succede se usi bash invece di sh?
Luciano Andress Martini,

Risposte:


0

Vi preghiamo di provare:

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

cioè: exec 2>&1su una linea separata, dicendo di reindirizzare stderr alla stessa cosa che stdout sta per (il tuo terminale? o posta se in un crontab?), seguito da cd & exec per sostituire il processo esistente con quello di python3.2. Nota che sono passato a bash invece di sh, per una portabilità inferiore ma di solito un'affidabilità molto migliore. Se funziona, fantastico, se non interverranno alcune persone meglio informate. (Non ho tempo di fare ricerche proprio ora su questo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.