Gunicorn throws an OSError opening file when supervisord is called

I have an application that submits a form and creates a PDF file with pdflatex, which is returned to the browser as a file attachment. It works when I call the application server manually, but when the server process starts Supervisord, it is interrupted ...

Django throws an OSError:

[Errno 2] No such file or directory Request Method: POST Request URL: http://apps.xxxxxxxx.com/pdf/view/1/85/ Django Version: 1.4.5 Exception Type: OSError Exception Value: [Errno 2] No such file or directory Exception Location: /usr/lib/python2.7/subprocess.py in _execute_child, line 1249 Python Executable: /home/ubuntu/Envs/venv/bin/python Python Version: 2.7.3 

The error is caused by this line: subprocess.call(shlex.split(proc_string), stdout=open(os.devnull, 'wb'))

Full trace:

 Traceback: File "/home/ubuntu/Envs/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs) File "/home/ubuntu/CURRENT/project/appname/apps/catpdf/views.py" in render_preview 114. subprocess.call(shlex.split(proc_string), stdout=open(os.devnull, 'wb')) File "/usr/lib/python2.7/subprocess.py" in call 493. return Popen(*popenargs, **kwargs).wait() File "/usr/lib/python2.7/subprocess.py" in __init__ 679. errread, errwrite) File "/usr/lib/python2.7/subprocess.py" in _execute_child 1249. raise child_exception Exception Type: OSError at /pdf/view/1/85/ Exception Value: [Errno 2] No such file or directory 

This is unusual because when I tested the application using the Django dev server or calling Gunicorn from the command line using gunicorn wsgi: app, the file returns successfully. Servers are always behind nginx.

Here is the section of code that generates the error (subprocess.call line):

  output = t.render(cont) oname = ''.join([slugify(context['qb_full_name']), datetime.datetime.now().strftime("%Y%m%d_%H%M")]) out_f = open(''.join([os.path.join(rnddir, oname), '.tex']), "w") out_f.write(output.encode('utf-8')) out_f.close() #jname = ''.join(['-jobname=', oname]) proc_string = ' '.join(['pdflatex', '-output-directory', rnddir, os.path.abspath(out_f.name)]) subprocess.call(shlex.split(proc_string), stdout=open(os.devnull, 'wb')) fname = os.path.join(rnddir, ''.join([oname, '.pdf'])) pdf = open(fname, 'r') for s in signatures: os.unlink(s) response = http.HttpResponse(FixedFileWrapper(pdf), content_type=mimetypes.guess_type(fname)[0]) response['Content-Disposition'] = 'attachment; filename="%s"' % os.path.basename(fname) response['Content-Length'] = os.path.getsize(fname) return response 

Local vars from django debugging:

 out_f <closed file u'/home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered/customer-name20130509_1541.tex', mode 'w' at 0x4211780> signatures ['/home/ubuntu/CURRENT/project/appname/apps/catpdf/tmp/tmpyJrUYO.pdf', '/home/ubuntu/CURRENT/project/appname/apps/catpdf/tmp/tmpLGMaRT.pdf'] rnddir '/home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered' proc_string u'pdflatex -output-directory /home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered /home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered/customer-name20130509_1541.tex' 

supervisor configuration:

 [program:gunicorn] directory=%(ENV_HOME)s/CURRENT/project user=ubuntu command=gunicorn --preload wsgi:appname environment=PATH="/home/ubuntu/Envs/venv/bin" stdout_logfile = %(ENV_HOME)s/CURRENT/logs/guni-access.log stderr_logfile = %(ENV_HOME)s/CURRENT/logs/guni-error.log autostart=True autorestart=True priority=997 
+4
source share
1 answer

You are overwriting the PATH environment variable. You need to use the absolute path to pdflatex for call to find it.

+4
source

Source: https://habr.com/ru/post/1479947/


All Articles