Передача результатів bash-сценарію після перенаправлення stderr [закрито]


9

через те, як мій хостинг робить речі, я повинен використовувати систему для надання послуг.

У цій службі є запущений файл, який він виконує, і передається у файл другого запуску. Але я використовую (заданий) пакет python, який записується до stderr замість stdout, і я не можу змусити його робити те, що я хочу.

Тому у мене є сценарій запуску для моєї служби:

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

який прокладений під час роботи системи журналу:

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

Але труба не з'єднує stderr (як очікувалося). Тож після googling я додав перехід до свого запуску:

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

Але це не вирішує мою проблему: мої власні результати (для виведення з використанням пітонів друку) реєструються як очікувалося. Вихід більш жорсткий не записується.

Якщо я перенаправляю модифікований сценарій на два файли, це показує, що перенаправлення немає (stderr все ще знаходиться на stderr). Як мені потрібно змінити перенаправлення на роботу?


5
exec ... 2>&1дійсно приєднує стандартну помилку до стандартної. Тож щось інше криється.
триг

3
Чи є шанс сценарію python закрити stderr і повторно відкрити його як файл? Шукайте дзвінок dup2()у коді. Будь-яка ідея , де вихід STDERR це відбувається? Ще одна думка: можливо, запущений файл вашого хостера перенаправляє stderr таким чином перед запуском коду.
Едвард Фолк

1
Чи можете ви абсолютно підтвердити, що текст надсилається в stderr? Замініть сценарій на той, який говорить, import sys; print("Hello, stderr", file=sys.stderr)щоб бути впевненим.
rosuav

3
Дійсно жорсткіше? Спробуйте це exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logі погляньте на цей журнал.
ingopingo

2
Що станеться, якщо ви використовуєте bash замість sh?
Luciano Andress Martini

Відповіді:


0

Будь ласка, спробуй:

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

тобто: exec 2>&1в окремому рядку повідомляють про переадресацію stderr на те саме, що збирається stdout (ваш термінал? або пошта, якщо в crontab?), а потім cd & exec замінити існуючий процес на python3.2. Зауважте, що я перейшов на bash замість sh, для меншої портативності, але зазвичай набагато кращої надійності. Якщо це спрацює, чудово, якщо не якісь більш обізнані люди вступлять. (Я не маю часу зараз робити дослідження з цього приводу)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.