Piping la sortie d'un script bash après la redirection de stderr [fermé]

9

en raison de la façon dont mon hébergeur fait les choses, je dois utiliser un système de services.

Ce service a un fichier d'exécution qu'il exécute et redirige vers un deuxième fichier d'exécution. Mais j'utilise un package python (donné) qui se connecte à stderr au lieu de stdout et je ne peux pas le faire faire ce que je veux.

J'ai donc un script d'exécution pour mon service:

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

qui est canalisé dans l'exécution du système de journalisation:

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

Mais le tuyau ne connecte pas stderr (comme prévu). Donc, après avoir googlé, j'ai ajouté une redirection à ma course:

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

Mais cela ne résout pas mon problème: mes propres sorties (pour stdout en utilisant l'impression pythons) sont enregistrées comme prévu. La sortie stderr n'est pas enregistrée.

Si je redirige mon script d'exécution modifié dans deux fichiers, cela montre qu'il n'y a pas de redirection (stderr est toujours sur stderr). Comment dois-je modifier ma redirection pour fonctionner?

xavor
la source
5
exec ... 2>&1rejoint en effet l'erreur standard en sortie standard. Donc, quelque chose d'autre ne va pas.
thrig
3
Est-il possible que le script python ferme stderr et le rouvre en tant que fichier? Recherchez un appel à dup2()dans le code. Toute idée où la sortie stderr est va? Une autre pensée: peut-être que le fichier run de votre hébergeur redirige stderr de cette façon avant de démarrer votre code.
Edward Falk
1
Pouvez-vous absolument confirmer que le texte est envoyé à stderr? Remplacez le script par un qui dit import sys; print("Hello, stderr", file=sys.stderr)pour être sûr.
rosuav
3
Vraiment stderr? Essayez ceci exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.loget jetez un œil à ces fichiers journaux.
ingopingo
2
Que se passe-t-il si vous utilisez bash au lieu de sh?
Luciano Andress Martini

Réponses:

0

S'il vous plaît essayez:

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

c'est-à-dire: exec 2>&1sur une ligne distincte, en disant de rediriger stderr vers la même chose que stdout va (votre terminal? ou mail si dans une crontab?), suivi par le cd & exec pour remplacer le processus existant par le processus python3.2. Notez que je suis passé à bash au lieu de sh, pour une portabilité inférieure mais généralement une bien meilleure fiabilité. Si cela fonctionne, très bien, sinon des personnes mieux informées interviendront. (Je n'ai pas le temps de faire des recherches en ce moment)

Olivier Dulac
la source