Вот низкий уровень.
- Во-первых, я использую экземпляр 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, несмотря на их привязкунормально когда вызывается с консоли. Понятия не имею почему.