9

because of the way my hoster does things I have to use a system for services.

This service has a run file which it executes and pipes into a second run file. But I use a (given) python package that logs to stderr instead of stdout and I can't get it to do what I want.

So I have a run script for my service:

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

which is piped into the run of the logging system:

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

But the pipe doesn't connect stderr (as expected). So after googling I appended a redirection to my run:

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

But this does not solve my problem: My own outputs (to stdout using pythons print) are logged as expected. The stderr output is not logged.

If I redirect my modified runscript into two files, it shows that there is no redirection (stderr is still on stderr). How do I have to modify my redirection to work?

9
  • 5
    exec ... 2>&1 does indeed join standard error into standard out. So something else is awry.
    – thrig
    Jun 17, 2016 at 17:37
  • 3
    Any chance the python script is closing stderr and re-opening it as a file? Look for a call to dup2() in the code. Any idea where the stderr output is going? Another thought: perhaps your hoster's run file is redirecting stderr this way before starting your code. Jun 23, 2016 at 4:30
  • 1
    Can you absolutely confirm that text is being sent to stderr? Replace the script with one that says import sys; print("Hello, stderr", file=sys.stderr) to be sure.
    – rosuav
    Feb 24, 2017 at 23:54
  • 3
    Really stderr? Try this exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log and take a look into this logfiles.
    – ingopingo
    Feb 26, 2017 at 15:39
  • 2
    What happen if you use bash instead of sh? Apr 25, 2017 at 14:54

1 Answer 1

0

Please try:

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

ie : exec 2>&1 on a separate line, telling to redirect stderr to the same thing stdout is going to (your terminal? or mail if in a crontab?), followed by the cd & exec to replace the existing process with the python3.2 one. Note that I switched to bash instead of sh, for a lower portability but usually a much better reliability. If this works, great, if not some better knowledgeable persons will step in. (I don't have time to do researchs right now on this)

Not the answer you're looking for? Browse other questions tagged or ask your own question.