Запустить скрипт Python при запуске автоматически? - PullRequest
0 голосов
/ 25 июня 2018

Я следовал нескольким учебникам, доступным в stackoverflow, о запуске скрипта python при запуске, но ни один из них не работает.

Мне нужно активировать virtualenv, а затем запустить флеш-сервер

  1. Iпопробовал метод init.d

Я сделал start.sh в /etc/init.d/

#!/bin/sh
### BEGIN INIT INFO
# Provides:          skeleton
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $portmap
# Should-Stop:       $portmap
# X-Start-Before:    nis
# X-Stop-After:      nis
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Interactive:     true
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

cd /home/ion/
source /home/ion/py35/bin/activate
cd /home/ion/Desktop/flask/
nohup python main.py &
echo "Done"

Его разрешения: chmod на + x

ion@aurora:/etc/init.d$ ll start.sh
-rwxr-xr-x 1 root root 625 Jun 25 19:10 start.sh*

Wentдо /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/etc/init.d/start.sh


exit 0

Не работает

метод cronjob

sudo crontab -e

и добавлен

@reboot sh '/etc/init.d/start.sh'

Также не работал, где яне так?

Журналы, запускаемые вручную

(py35) ion@aurora:~/Desktop/flask$ python main.py 
WARNING:tensorflow:From /home/ion/Desktop/flask/encoder.py:57: calling l2_normalize (from tensorflow.python.ops.nn_impl) with dim is deprecated and will be removed in a future version.
Instructions for updating:
dim is deprecated, use axis instead
2018-06-25 19:34:05.511943: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://localhost:5505/ (Press CTRL+C to quit)
 * Restarting with stat

1 Ответ

0 голосов
/ 25 июня 2018

1) Не используйте старый метод init.d. Используйте что-то современное. Если у вас Ubuntu 15.04 и выше, вы можете использовать Systemd для создания демона, который будет запускаться автоматически при запуске. Если у вас есть, например, Ubuntu старше 15.04 - используйте Upstart.

Для Systemd:

Создайте файл модуля в /lib/systemd/system/you_service_name.service со следующим содержимым (насколько я вижу, ваш скрипт python не порождает новый процесс во время работы, поэтому Type должен быть simple. Подробнее здесь ):

[Unit]
Description=<your_service_name>
After=network.target network-online.target

[Service]
Type=simple
User=<required_user_name>
Group=<required_group_name>
Restart=always
ExecStartPre=/bin/mkdir -p /var/run/<your_service_name>
PIDFile=/var/run/<your_service_name>/service.pid
ExecStart=/path/to/python_executable /path/to/your/script.py

[Install]
WantedBy=multi-user.target

Сохраните этот файл и перезагрузите systemd:

sudo systemctl daemon-reload

Затем добавьте свой сервис в автозапуск:

sudo systemctl enable you_service_name.service

вы должны увидеть, что Systemd создал необходимые символические ссылки после действия enable.

Перезагрузите компьютер и посмотрите, работает ли он (ps aux | grep python или sudo systemctl status you_service_name.service). Если есть что-то странное - проверьте журнал Systemd:

sudo journalctl -xe

UPD:

Чтобы запустить скрипт Python в нужном вам virtualenv, просто используйте это выражение в файле вашего сервисного модуля:

ExecStart=/venv_home/path/to/python /venv_home/path/to/your/script.py

2) Вы также можете использовать crontab, но вам нужно указать полный путь для желаемой оболочки, например:

@reboot /bin/bash /path/to/script.sh

Если вам нужна дополнительная помощь - просто дайте мне знать здесь.

...