Передача выходных данных скрипта 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 (как и ожидалось). Поэтому после поиска в Google я добавил перенаправление к своему бегу:

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

Но это не решает мою проблему: мои собственные выходные данные (для вывода с использованием pythons print) записываются как положено. Вывод stderr не зарегистрирован.

Если я перенаправляю мой измененный скрипт выполнения в два файла, это показывает, что перенаправление отсутствует (stderr все еще находится в stderr). Как мне изменить мое перенаправление для работы?

Xavor
источник
5
exec ... 2>&1действительно объединяет стандартную ошибку в стандартную. Так что еще что-то не так.
thrig
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и посмотрите на эти файлы журнала.
Ингопо
2
Что произойдет, если вы используете bash вместо sh?
Лучано Андресс Мартини

Ответы:

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, для меньшей мобильности, но обычно для большей надежности. Если это сработает, отлично, если не вмешаются более знающие люди. (У меня нет времени сейчас исследовать это)

Оливье Дюлак
источник