Библиотеки Virtualenv неправильно связываются в скрипте Python при запуске из скрипта init.d, но не при нормальной работе - PullRequest
0 голосов
/ 02 октября 2018

Вот низкий уровень.

  • Во-первых, я использую экземпляр EC2 с Amazon Linux (оригинал, а не Amazon Linux 2), ограничивая меня sysV вместо systemd.
  • У меня естьсервер приложений Flask, работающий на сервере CherryPy WSGI с обратным прокси-сервером Nginx перед ним.
  • Сервер WSGI и сервер приложений находятся в пределах python3 virtualenv.
  • Сервер работает в пределах virtualenv очень хорошо.
  • Помещение #!строка с расположением корзины Python virtualenv в верхней части файла сервера позволяет мне запускать сервер из любой точки системы (без предварительной активации virtualenv), вводя полный путь к сценарию сервера: /path/to/server.py
  • Однако, когда я пытаюсь запустить это из скрипта init.d, я получаю ошибку ModuleNotFoundError: No module named 'cherrypy'.
  • Я также пытался использовать activ_this.py, чтобы получить тот же результат.

Вот некоторый (анонимный) код, чтобы увидеть, помогает ли это:

server.py:

#!/path/to/myVenv/bin/python

# Activate virtualenv from within this script:
# Commented out as it doesn't seem to help
# activate_this = "/path/to/myVenv/bin/activate_this.py"
# exec(compile(open(activate_this, "rb").read(), activate_this, 'exec'), dict(__file__=activate_this))

# Import your application as:
# from wsgi import application
# Example:

from wsgi import application

# Import CherryPy
import cherrypy

if __name__ == '__main__':

    # Mount the application
    cherrypy.tree.graft(application, "/")

    # Other CherryPy stuff here. Not relevant as script doesn't progress this far
    # when it breaks and works fine when it doesn't

/ etc / init.d / crowded (основано на https://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html)

#!/bin/bash
#
# chkconfig: 35 90 12
# description: CrowdEd server
#

# Based on file found at
# https://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html

PATH=/path/to/myVenv/bin

# Get function from functions library
. /etc/init.d/functions

# Start the service FOO
start() {
        initlog -c "echo -n Starting CrowdEd server: "
        /path/to/server.py &
        ### Create the lock file ###
        touch /var/lock/subsys/crowded
        success $"CrowdEd server startup"
        echo
}

# Restart the service FOO
stop() {
        initlog -c "echo -n Stopping CrowdEd server: "
        killproc server.py
        ### Now, delete the lock file ###
        rm -f /var/lock/subsys/crowded
        echo
}

### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status crowded
        ;;
  restart|reload|condrestart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac

exit 0

TL; DR: скрипт Python, который работает при записи из консоли, не работает при вызове из сценария init.d, в частности, не удается связать библиотеки в virtualenv при вызове из сценария init, несмотря на их привязкунормально когда вызывается с консоли. Понятия не имею почему.

...