Передача выходных данных скрипта 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). Как мне изменить мое перенаправление для работы?


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.