Запуск сценарію Python при запуску


29

Це запитання було задано досить багато разів, але я, здається, не працював, використовуючи наявну інформацію.

Мій Пі працює Raspbian. У мене є сценарій Python на ім’я dnscheck.py, який циклічно назавжди.

Мені це потрібно для запуску під час завантаження. Я знаю, що мені потрібно створити .sh файл, що містить щось на кшталт

sudo python dnscheck.py &

Що я не знаю, це де цей файл повинен знаходитись чи він повинен містити щось інше. Я знаю про папку init.d, але, бачачи приклад скелета, я думаю, що для цього простого завдання повинно бути більш простий спосіб.


дійсно простий спосіб перевірити цей покроковий посібник -> youtu.be/Tvnrx-2QaUU зробіть стільки пускових установок, скільки вам потрібно, і зверніться до них у crontab
Hossein RM

Відповіді:


20

Якщо ви хочете керувати процесом за допомогою таких команд, як запуск, зупинка, перезапуск тощо, використовуючи сценарій скелета, і змінити його для своїх цілей може бути найкращим варіантом.

Якщо ви просто хочете, щоб процес почався, введіть команду /etc/rc.local. (У мене немає RPI під рукою, але я прочитав в Інтернеті, що там є рядок "вихід 0", ви повинні поставити свою команду над цим рядком)


1
Це спрацювало! Треба додати, що встановлення дозволів для скрипту та rc.local назад до 755 (читання / запис / виконання) є обов'язковим. Не впевнений, чи потрібні обом цей параметр, але він працював на мене. Дякую за допомогу!
Влад Шнаковський

7
"як ви це написали у своєму запитанні" Не зовсім - вам не потрібно судо, як rc.localпрацює root. Ви також повинні вказати повний шлях до сценарію, очевидно. Ви також повинні додати& наприкінці, щоб сценарій роздвоявся, наприклад /path/to/foobar.py &.
золотинки

1
@goldilocks Ви можете, будь ласка, пояснити, чому мені потрібно додати &? Тому що коли я користуюся без нього, все ще працює так, як очікувалося.
Huy.PhamNhu

2
@ Huy.PhamNhu Відповідь на ваше запитання: Pi запустить цю програму під час завантаження та перед запуском інших служб. Якщо ви не включите ampersand і якщо ваша програма працює постійно, Pi не завершить процес завантаження. Ampersand дозволяє команді запускатися в окремому процесі і продовжувати завантаження з запущеним основним процесом.
Амін Харбауї

6

Перемістіть свій скрипт (ми збережемо його у файл dnscheck) /etc/init.d/та встановіть дозволи, щоб він міг працювати:

chmod 755 /etc/init.d/dnscheck

Додайте теги LSB init у верхній частині сценарію. Ви, ймовірно, захочете змінити «Обов’язковий запуск / зупинка» та «Теги опису», щоб відповідати вашому сценарію.

### 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 1/2 роки тому, і воно все ще працюватиме, оскільки нова система init Raspbian назад сумісна зі сценаріями стилів LSB / SysV, новим користувачам краще навчитися використовувати нову систему замість ( systemd ) якщо просто додавання рядка до /etc/rc.localнедостатньо
золотинок

3

Звичайно, це багато способів, але не забудьте скористатися cron. Якщо ви помістите @rebootрядок у свій crontab, ця команда буде виконуватися при кожному перезапуску.

Щоб перевірити, я щойно додав наступний рядок до моєї користувацької crontab із crontab -e: @reboot echo "$(date)" >> ~/boot.txt Бонус до цього методу полягає в тому, що ви можете зателефонувати до роботи за необхідним інтервалом, окрім просто часу завантаження, і вам не потрібно редагувати скрипти init.


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

Читати докладніше


3

Я дуже здивований, що тут не згадано про демонтоли djb . Daemontools здійснює належний нагляд за процесом, і ви можете додавати цікаві функції, такі як автоматично обертається ведення журналу. TL; DR, якщо ви не знайомі ні з цим, ваш процес буде перезапущений кожен раз, коли він вийде з ладу, і запуститься автоматично, коли ваш Pi ввімкнеться. Це чудово, якщо ви написали погану програму python, яка має режими відмов, але ви не хочете, щоб вона просто загинула, якщо сталася помилка.

Встановити:

sudo apt-get install daemontools daemontools-run

Потім виконайте кроки для створення демонізованих процесів:

Це здебільшого так просто, як копіювання runсценарію в /etc/service/<my_custom_service_name>інший львів: ви можете запустити будь-який користувач або root! Деталі у посиланні.

FWIW У мене був проект Pi, в якому я мав 3 різні процеси python (кожен мав цикл виконання, використовуючи час процесора, тому за допомогою 3 процесів я дозволяв кожному процесу використовувати 1 ядро ​​CPU). 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/

і перезапустіть ваш малиновий пі, і він повинен автоматично запустити вашу програму в новому терміналі


будь ласка, не вирізайте та не вставляйте відповіді на кілька запитань. Якщо відповідь однакова, нову версію слід позначити як дублікат.
Стів Робільярд

Єдиною причиною, чому я цього не зробив, було те, що ця сторінка мала більше перегляду на відміну від іншої.
еволюціоніст

@SteveRobillard Я також не думаю, що у мене є необхідний повтор для цього
еволюціоніст

Позначення публікації займає лише 15 повторів. Вирішувати, що з цим робити, - це робота модераторів - тому кількість переглядів не має значення. Повторювані відповіді система автоматично помічає у відповідь. Вони є формою ігрової системи. Тому я видалив третій.
Стів Робіллард

@SteveRobillard Дякую за інформацію і пробачте моє незнання. Я там позначив попереднє питання як дублікат.
еволюціоніст

2

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


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-файла для виконання


Зауважте, що це не спрацює, якщо ви не запуститесь у гуї (тобто: запустіть пі без голови)
Хавнар,

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.