из-за того, как мой хостер делает вещи, я должен использовать систему для услуг.
У этой службы есть файл запуска, который он выполняет и передает во второй файл запуска. Но я использую (данный) пакет 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). Как мне изменить мое перенаправление для работы?
источник
exec ... 2>&1
действительно объединяет стандартную ошибку в стандартную. Так что еще что-то не так.dup2()
в коде. Любая идея , где выход STDERR это происходит? Другая мысль: возможно, файл запуска вашего хостера перенаправляет stderr таким образом перед запуском вашего кода.import sys; print("Hello, stderr", file=sys.stderr)
наверняка.exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
и посмотрите на эти файлы журнала.Ответы:
Пожалуйста, попробуй:
то есть:
exec 2>&1
в отдельной строке указание перенаправить stderr к тому же объекту, на который собирается stdout (ваш терминал? или почта, если в crontab?), затем cd & exec, чтобы заменить существующий процесс на python3.2. Обратите внимание, что я переключился на bash, а не на sh, для меньшей мобильности, но обычно для большей надежности. Если это сработает, отлично, если не вмешаются более знающие люди. (У меня нет времени сейчас исследовать это)источник