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
Если вам нужна дополнительная помощь - просто дайте мне знать здесь.