Запуск скрипта Python при запуске

29

Этот вопрос задавался довольно много раз прежде, но я, кажется, не получал его, используя существующую информацию.

Мой Пи работает с Распбианом. У меня есть сценарий Python с именем dnscheck.py, который зацикливается навсегда.

Мне нужно, чтобы запустить при загрузке. Я знаю, что должен создать файл .sh, содержащий что-то вроде

sudo python dnscheck.py &

Чего я не знаю, так это того, где этот файл должен находиться или должен ли он содержать что-то еще. Я знаю о папке init.d, но, увидев пример скелета, я думаю, что должен быть более простой способ выполнить эту простую задачу.

Влад Шнаковски
источник
для действительно простого способа ознакомьтесь с этим пошаговым руководством -> youtu.be/Tvnrx-2QaUU создайте столько лаунчеров, сколько вам нужно, и укажите их все в crontab
Hossein RM

Ответы:

20

Если вы хотите управлять процессом с помощью таких команд, как запуск, остановка, перезапуск и т. Д., Используя скрипт-скелет, и изменение его для ваших целей может быть лучшим вариантом.

Если вы просто хотите, чтобы процесс запускался, введите команду в /etc/rc.local. (У меня нет моего RPi, но я прочитал в Интернете, что там есть строка 'exit 0', вы должны поместить свою команду выше этой строки)

Икку
источник
1
Это сработало! Я должен добавить, что установка разрешений для скрипта и rc.local обратно на 755 (чтение / запись / выполнение) является обязательной. Не уверен, нужно ли обоим этим настройкам, но у меня все получилось. Большое спасибо за помощь!
Влад Шнаковски
7
"как вы написали в своем вопросе" Не совсем - вам не нужен sudo, поскольку rc.localзапускается root. Вы также должны указать полный путь к сценарию, очевидно. Вы также должны добавить& в конце, чтобы скрипт разветвился, например /path/to/foobar.py &.
Златовласка
1
@goldilocks не могли бы вы объяснить, почему мне нужно добавить &? Потому что, когда я использую без него, все еще работает, как ожидалось
Huy.PhamNhu
2
@ Huy.PhamNhu Отвечая на ваш вопрос: Pi запустит эту программу при загрузке и до запуска других служб. Если вы не включаете амперсанд и если ваша программа работает непрерывно, Pi не завершит процесс загрузки. Амперсанд позволяет команде запускаться в отдельном процессе и продолжать загрузку при работающем основном процессе.
Амине Харбауи
6

Переместите ваш скрипт (мы сохраним его в файл dnscheck) /etc/init.d/и установите права доступа, чтобы он мог выполняться:

chmod 755 /etc/init.d/dnscheck

Добавьте теги LSB init в начало вашего скрипта. Возможно, вы захотите изменить Required-Start / Stop и теги Description для соответствия вашему сценарию.

### BEGIN INIT INFO
# Provides:          dnscheck
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Затем создайте символические ссылки, запустив

update-rc.d /etc/init.d/dnscheck defaults
Берт
источник
2
Пожалуйста, учтите, что хотя это был достойный ответ 3,5 года назад и будет работать, потому что новая система инициализации Raspbian обратно совместима со сценариями в стиле LSB / SysV, новым пользователям было бы лучше научиться использовать новую систему вместо этого ( systemd ) если просто добавить строку в /etc/rc.localнедостаточно.
Златовласка
3

Конечно, есть много способов сделать это, но не забывайте использовать cron. Если вы поместите @rebootстроку в ваш crontab, эта команда будет выполняться при каждом перезапуске.

Чтобы проверить, я просто добавил следующую строку в свой пользовательский crontab с помощью crontab -e: @reboot echo "$(date)" >> ~/boot.txt Преимущество этого метода заключается в том, что вы можете вызывать задание, как требуется, с другими интервалами, кроме просто времени загрузки, и вам не нужно редактировать сценарии инициализации.

bobstro
источник
3

если вы используете файл rc.local, это может быть полезно для устранения неполадок. Вы можете добавить строки регистрации в журнал ошибок (stderr) и вывод команды (stdout) в файл журнала. Согласно этому примеру этот файл сохраняется в /tmp/rc.local.log

#!/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.

exec 2> /tmp/rc.local.log      # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file

# Your other commands...

exit 0

Читать дальше

Tharanga
источник
3

Я очень удивлен Djb игровой Daemontools не упоминается здесь. Daemontools обеспечивает надлежащий контроль процесса, и вы можете добавлять интересные функции, такие как автоматически вращаемая запись в журнал. TL; DR, если вы не знакомы ни с чем из этого, ваш процесс будет перезапускаться каждый раз при сбое и запускаться автоматически при включении Pi. Это замечательно, если вы написали плохую программу на Python, в которой есть режимы сбоев, но вы не хотите, чтобы она просто умерла при возникновении ошибки.

Установка:

sudo apt-get установить daemontools daemontools-run

Затем выполните шаги для создания демонизированных процессов:

В основном это так же просто, как копирование runскрипта в /etc/service/<my_custom_service_name>другой перк: вы можете запускать от имени любого пользователя или пользователя root! Подробности в ссылке.

У меня был проект Pi, в котором у меня было 3 разных процесса Python (у каждого был цикл выполнения с использованием процессорного времени, поэтому, используя 3 процесса, я позволил каждому процессу использовать 1 ядро ​​процессора). Daemontools позволил мне убедиться, что все 3 автоматически запустятся и будут работать после того, как я подключу Pi.

Сэм
источник
простое и легкое решение, ваш ответ сэкономил много времени, спасибо ..
ShivaGuntuku
2

Вот решение, которое я постоянно использую.

Создать файл рабочего стола

xyz.desktop

введите в него следующее

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=<Application Name Goes here>
Comment=
Exec=  python /home/pi/Desktop/execute_on_boot.py
StartupNotify=false
Terminal=true
Hidden=false

вставьте этот файл в

/home/pi/.config/autostart/

и перезапустите ваш Raspberry Pi, и он должен автоматически запустить вашу программу в новом терминале

evolutionizer
источник
пожалуйста, не вырезайте и не вставляйте ответы на несколько вопросов. Если ответ тот же, более новая версия должна быть помечена как дубликат.
Стив Робиллард
Единственная причина, по которой я этого не сделал, заключалась в том, что эта страница имела большее количество просмотров, чем другая.
эволюционист
@ SteveRobillard Я также не думаю, что у меня есть репутация, необходимая для этого
evolutionizer
Пометка сообщения занимает всего 15 повторений. Решать, что с этим делать, - дело модераторов, поэтому количество просмотров не имеет значения. Дублирующиеся ответы автоматически помечаются системой. Они являются формой игровой системы. Поэтому я удалил третий.
Стив Робиллард
@SteveRobillard Спасибо за информацию и простите мое невежество. Я пометил предыдущий вопрос как дубликат.
Эволюционер
2

Чтобы использовать файл .py, просто поместите строку #!/usr/bin/pythonв самом начале вашего файла. Затем сделайте его исполняемым с chmod +x filename. Затем добавьте строку /path/to/file.py &в /etc/rc.localдо exit 0линии (замены /path/to/file.pyс путем к вашему сценарию). Это заставит ваш скрипт на python выполняться в конце загрузки.

Theoremiser
источник
0

Вот еще более простой метод, который работал для меня. Изменить автозапуск в LXDE.

Откройте терминал и отредактируйте файл автозапуска следующим образом:

sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart

добавьте следующую строку текста внизу (при необходимости измените путь к месту вашего example.py)

@/usr/bin/python /home/pi/example.py

ctr-x и сохранить. Вам может потребоваться сделать исполняемый скрипт Python следующим образом:

sudo chmod +x /home/pi/example.py

ссылка для автозапуска в LXDE и ссылка для создания исполняемого Python

гидроника
источник
Обратите внимание, что это не будет работать, если вы не запускаете в графическом интерфейсе (т. Е. Запускаете пи без головы)
Havnar
0

эти решения не помогли мне попробовать запустить скрипт на Python с запущенным Feh. Следующее сработало. Он запускает скрипт после входа в систему.

Откройте сеанс терминала и отредактируйте файл

sudo nano /etc/profile

Добавьте следующую строку в конец файла

/home/pi/your_script_name.sh

замените имя и путь скрипта на правильное имя и путь вашего скрипта запуска. Сохранить и выйти

Нажмите Ctrl + X, чтобы выйти из нано-редактора, затем Y, чтобы сохранить файл.

Вот как выглядел мой script.sh:

#!/bin/sh
cd /
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /

Я думаю, что сделал как script.sh, так и script.py исполняемым с помощью chmod

sudo chmod +x home/pi/your_script_name.sh
sudo chmod +x home/pi/your_python_script.py
гидроника
источник