Виконати сценарій при запуску


189

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

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

Я заглянув у Upstart , але я намагаюся зрозуміти, як це працює. Будь-які сценарії, які я спробував, не спрацювали, коли я їх перевіряв.


4
Яку операційну систему ти працюєш? У FreeBSD, який я використовую на своєму Pi, ви можете додати сценарії запуску до /usr/local/etc/rc.d/, або просто додати речі до /etc/rc.local. У різних дистрибутивах Linux є різні рекомендовані методи. Якщо ви використовуєте X на ньому, вам варто поглянути на додавання речей у свій файл .xinitrcчи .xsessionфайл.
ghoti

Більше інформації про процес запуску X можна знайти тут .
ghoti

6
Зауважте, що у прийнятій відповіді тут є деякі застереження, і технічно вони не запускають нічого під час завантаження, за винятком конкретних умов. Прочитай уважно.
золотинки

Ви запитуєте сценарій, який запускається під час входу в систему, а не під час завантаження пі або під час запуску. Дві дуже різні речі, а заголовок - це перекос результатів пошуку Google.
IAmNaN

Відповіді:


197

Щоб запустити Midori при запуску, подивіться цей підручник . Про власні рішення читайте далі.


Ви можете додати виконувану команду сценарію в нижню частину, .bashrcяка буде запускати ваш скрипт щоразу, коли відкривати термінал (або запускати новий примірник bash) .

  1. Переконайтеся, що ви знаходитесь в piпапці:

    $ cd ~
    
  2. Створіть файл та напишіть сценарій для запуску у файл:

    $ sudo nano superscript
    
  3. Збереження і вихід: Ctrl+ X, Y,Enter

  4. Відкрити .bashrcдля конфігурації:

.bashrcце НЕ призначений для запуску сценаріїв.

Він запускається щоразу, коли інтерактивна оболонка без входу в систему запускається і використовується для налаштування оболонки.
~/.bashrc: executed by bash(1) for non-login shells.

   $ sudo nano .bashrc
  1. Прокрутіть униз донизу та додайте рядок: ./superscript

  2. Збереження і вихід: Ctrl+ X, Y,Enter


Якщо ви шукаєте рішення, яке працює на завантаженні консолі , перегляньте це посилання . Основний перехід:

  1. Створіть файл для свого сценарію запуску і напишіть свій сценарій у файл:

    $ sudo nano /etc/init.d/superscript
    
  2. Збереження і вихід: Ctrl+ X, Y,Enter

  3. Зробіть сценарій виконуваним:

    $ sudo chmod 755 /etc/init.d/superscript
    
  4. Реєстрація сценарію для запуску:

    $ sudo update-rc.d superscript defaults
    

Якщо ви хочете, щоб сценарій запускався під час завантаження в середовище LXDE , ви можете ознайомитися з цим повідомленням на форумі Raspberry Pi :

  1. Перейдіть до ~/.config/lxsession/LXDE-pi

  2. Відкрийте autostartфайл у цій папці:

    $ sudo nano autostart
    
  3. Додати @midoriв новому рядку. Якщо ви хочете запустити щось на зразок сценарію python, поставте щось на кшталт @python mypython.pyнового рядка. Запуск файлу сценарію було б @./superscript, але чомусь сценарій працює у нескінченному циклі (можливо, це зупинить це).

  4. Збереження і вихід: Ctrl+ X, Y,Enter

  5. Перезавантажте Raspberry Pi в середовищі LXDE.


Підручник із налаштування Midori при запуску було саме те, що я шукав. Не впевнений, чому існує стільки способів зробити таку просту річ, але я радий, що зараз це працює.
Тайлер Меррі

1
@ syb0rg Запуск під час входу в систему працює як шарм (+1), якщо я входжу через ssh, але не тоді, коли розпочнеться сеанс на робочому столі lxde. чи є спосіб це зробити?
Джордж Профенза

@GeorgeProfenza Коли ти це робиш $ sudo startx?
syb0rg

2
Я просто хотів зазначити, що сценарій pyhton буде працювати, але якщо є якісь помилки, він буде просто десь у фоновому режимі, використовуючи метод / etc / xdg / lxsession / LXDE / autostart. Використання .barshrc також виявить помилки, але дуже важливо переконатися, що сценарій в першу чергу є жорстким (виявив, що це важкий шлях :))
George Profenza

7
.bashrcне читається, коли система завантажується або коли користувач входить у систему , лише під час відкриття нового терміналу (і він читається кожного разу, коли користувач відкриває новий термінал). Мене бентежить, що ця відповідь отримала так багато відгуків: перша частина - явно неправильна . Третя частина правильна для виконання програми GUI.
Жиль

46

Те, як я бачив більшість людей, що це роблять (дивіться на форумах Raspberry Pi), і я зробив це з успіхом /etc/rc.local.

Все, що вам потрібно зробити тут, - ./myscriptце текстовий файл rc.local. Якщо це в python, покладіть python myscript.py.

Це буквально є "простим рішенням (як, наприклад, потрапляння мого сценарію в якийсь каталог" запуску "чи щось подібне)" - можливо, шукайте на форумах, коли у вас виникають питання, це рішення з'явилося на перших 4 результатах Пошук Google!


4
FYI у rc.local за замовчуванням є різні коментарі щодо того, що сценарій нічого не робить, і потрібні біти виконавчих файлів змінені. Це неправда, просто введіть команду для вашого сценарію до виходу 0 і він запуститься при запуску. Переконайтеся, що ваш сценарій закінчується із запуском у фоновому режимі, або він заблокує рядок входу. Так, це я і зробив.
пограбувати


@rob Ви хочете сказати, що вони пропонують встановити сценарій як виконуваний файл? Це пом'якшується у питанні, запускаючи скрипт командою python myscript.py. Якщо ви хочете CHMOD + х і додати #! /bin/python, ви можете запустити скрипт, виконавши , $pathtofile/myscript.pyде $pathtofileце , .якщо ви перебуваєте в тому ж каталозі , або абсолютний або відносний шлях до файлу.
JFA

1
Це не добре для програми GUI, наприклад браузера. /etc/rc.localполягає лише в запуску системних служб (програм, які не мають інтерфейсу користувача).
Жиль

1
@ ErickM.Sprengel Використовуйте одну з правильних відповідей на цю тему, наприклад, цю .
Жиль

32

Додайте його до кронтабу

Crontab виконує команди у визначений час.


Відредагуйте файл:

sudo crontab -e

Додайте рядок до файлу (тут сценарій пітона):

@reboot python3 /home/pi/Desktop/exemple.py &

2
Щоб трохи тут не запозичитись, технічно це не команда, яка виконує команду, але все одно. Що стосується перерахованого рядка, який потрібно додати, доцільно розмістити повний шлях для визначених тут команд (у цьому випадку повний шлях до python3), дивіться тут
Ghanima

Це метод, яким я завжди користувався завдяки своїй простоті. +1
Патрік Кук

Це не добре для програми GUI, наприклад браузера. /etc/rc.localполягає лише в запуску програм, які не мають інтерфейсу користувача.
Жиль

2
Витративши багато часу, намагаючись змусити його працювати з rc.local та init.d та всілякими іншими речами .. це спрацювало відразу! Дякую багато!
Пьотр Кула

4
це не працює чомусь у rpi os
Денис

11

Автозапуск програм xorg

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

Крім того, ви можете орієнтуватися на певне середовище робочого столу, як описано на веб-сторінці https://wiki.archlinux.org/index.php/autostarting .

Запуск сценарію як системна служба

Якщо ваш скрипт відповідає опису демона або "послуги", а у вашій системі працює systemd, що стосується raspbian та найсучасніших ліній, то ви можете налаштувати свій сценарій як запуск системної служби - це забезпечує детальний контроль над середовище життєвого циклу та виконання, а також передумови для (повторного) запуску сценарію, такі як мережа, що працює і працює. Також можливо налаштувати перезапуск служби в разі відмови ( Restart=alwaysі затримки між перезапуском, наприклад RestartSec=10).

Для загальносистемного використання створіть файл системного блоку під /etc/systemd/system, наприклад, за допомогою vim /etc/systemd/system/autossh.service:

[Unit]
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=/usr/bin/killall -9 autossh
### NOTE: you can have multiple `ExecStop` lines
ExecStop=/usr/bin/killall ssh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Дивитися також:

Тепер ми готові перевірити послугу:

systemctl start autossh

Перевірка статусу послуги:

systemctl status autossh

Припинення послуги:

systemctl stop autossh

Після того, як ви переконалися, що сервіс працює так, як очікувалося, включіть його за допомогою:

systemctl enable autossh

ПРИМІТКА. У цілях безпеки systemdсценарій буде запускатися в обмеженому середовищі, подібно до того, як crontabвиконуються сценарії, тому не робіть жодних припущень щодо існуючих системних змінних. Використовуйте Environmentклавіші, якщо ваш сценарій потребує визначення конкретних змінних. Додавання set -xвгорі вашого скрипта bash та його запуску systemctl status my_serviceможе допомогти визначити, чому ваш сценарій не працює. Як правило tumb, завжди використовувати абсолютні шляхи для все , включаючи echoі cat, або явно визначити ваш $ PATH.


7

Я хочу кинути свої два центи, навіть якщо це давнє питання, але зазвичай просять зробити просту річ - автозапуск. Я спробував усі запропоновані рішення у всіх відповідях на це питання. НІхто з них не працював на мене. Я використовую Raspberry PI Model 2 з Raspbian.

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

1.Створіть порожній файл з розширенням .sh і назвіть його все, що завгодно.

2.Копіюйте та вставте наступні ТАКОЖ, за винятком того, як змініть "ім'я програми" на ім'я сценарію, яке ви тільки що створили.

 #! /bin/sh

 ### BEGIN INIT INFO
 # Provides:          noip
 # Required-Start:    $remote_fs $syslog
 # Required-Stop:     $remote_fs $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Simple script to start a program at boot
 ### END INIT INFO

 #change /direct/path/to/your/application to the path your application is in.
 cd /direct/path/to/your/application      # example cd /home/pi/myprogram/

 #change YourProgramExactName to Exact name of your program that you want to auto start
 ./YourProgramExactName

 exit 0 
  1. Потім збережіть файл сценарію в папці програми

  2. Потім відкрийте /home/pi/.config/autostartпапку. У вашому випадку це може бути інакше. Просто відкрийте домашню папку та включіть перегляд прихованих папок. відкрити .config/autostart. Якщо ви не бачите папку автоматичного запуску, створіть папку під назвою автозапуск у папці .config.

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

  4. Скопіюйте та вставте наступний в порожній файл робочого столу , за винятком вам потрібно буде змінити Comment, Name, Exec, Pathі Iconзначення поля.

    [Desktop Entry]
    Comment=
    Exec=/path/to/Your/application/Name-of-the-script-file (.sh)
    Icon=/Path/to/Your/application/Icon/IconName
    Name=YourApplicationEXACTNAME
    Path=/Path/to/Your/Application-ONLY
    Type=Application
    
  5. Збережіть і закрийте файл після зміни всіх необхідних полів. Ви закінчили. Просто випробуй це.


Технічно цим сценарієм керує система, а не конкретний користувач - тож можливо ваша програма краще належить до /usr/local/bin/ApplicationName...?
SlySven

@SlySven "система" - це конкретний користувач.
Обмежене спокутування

Це запуск як root (UID = 0), або pi-користувач (UID ~ 500 або 1000 IIRC) - якщо він запускається як root або інший системний UID (менше 500), традиційно добре зберігати файл сценарію ( або будь-яке, що від цього залежить) на кореневому пристрої, так що якщо виникне проблема з будь-яким іншим пристроєм (наприклад, homeякщо це окремий пристрій), не буде проблеми з тим, що файл сценарію (або виконуваний файл) недоступний, коли система не вдається повернутись до єдиної /bin/shоболонки користувача ! Сьогодні systemdспосіб встановити і те, /і /usrраніше, ніж почати PID 1 ...
SlySven

5

У мене теж були проблеми з цим. На Raspberry Pi3 під керуванням Raspbian ось що я зробив:

  1. Створіть сценарій оболонки запуску у вашому кореневому каталозі (я назвав шахту "запуск"):

sudo leafpad launch.sh

  1. Збережіть файл
  2. Відредагуйте файл автозапуску LXDE-pi

лист судо /home/pi/.config/lxsession/LXDE-pi/autostart

  1. Додайте це внизу цього файлу

./launch.sh

  1. перезавантажити

3

На Raspberry Pi3 під керуванням Raspbian Stretch ось що я зробив:

Відредагуйте файл автозапуску LXDE-pi

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

Додайте це внизу цього файлу

    @sudo python3 /path/to/your/script.py

зберегти та перезавантажити


1

Спосіб 1:

Щоб автоматично запустити команду при вході, введіть команду у файл з назвою

.bashrc

в каталозі користувачів (наприклад / home / pi)

.bashrcце НЕ призначений для запуску сценаріїв.

Він запускається щоразу, коли інтерактивна оболонка без входу в систему запускається і використовується для налаштування оболонки.
~/.bashrc: executed by bash(1) for non-login shells.

Наприклад, файл може містити

chromium-browser --kiosk www.google.com

запустити Chromium у повноекранному режимі, вказуючи на www.google.com


Спосіб 2:

Це рішення працює дуже добре. Після завантаження браузера з’являється невеликий чорний квадрат у верхній лівій частині екрана, який, здається, є загальною помилкою (його згадують на форумах іншими), але в іншому випадку режим повноекранного режиму приховує все, крім сторінки браузера.

Редагуйте файл автозапуску:

sudo nano /etc/xdg/lxsession/LXDE/autostart 

Прокоментуйте все, використовуючи "#" на початку кожного рядка, а потім додайте наступні рядки

Автоматично запустити браузер

@xset s off
@xset -dpms
@xset s noblank
@midori -e Fullscreen -a http://google.com

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

sudo raspi-config

Якщо вам потрібно повернутися до командного рядка CTRL+ ALT+F1

CTRL+ ALT+F2


0

Ви можете розмістити свій скрипт у нижній частині /etc/profileфайлу.

Інші параметри для мене не спрацювали, але це можливо тому, що я розмістив свій сценарій на робочому столі.


0

Створіть .sh файл із командами 'python /path/to/your/script.py' type 'sudo nano /etc/rc.local' та введіть шлях до файлу .sh

раніше

exit 0

Або ви могли просто ввести

crontab -e

або

sudo crontab -e 

якщо ви хочете, щоб сценарій запускався при запуску

всередині типу файлу в

@reboot python /path/to/your/script.py &

2
Використання повних контурів настійно рекомендується для записів на кронтабі!
Ghanima

-2

це РОБОТА. (Під час кожного перезавантаження підготуйте такі подання автоматично)

$ cat /etc/rc.local
#!/bin/sh -e
echo "18" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio18/direction
echo "1" > /sys/class/gpio/gpio18/value
exit 0

-2

Це те, що я взагалі роблю.

  1. Зберігайте свій файл у домашньому каталозі малинових пі. Напр .: mycode.py
  2. Відредагуйте файл:

    sudo nano .bashrc

.bashrcце НЕ призначений для запуску сценаріїв.

Він запускається щоразу, коли інтерактивна оболонка без входу в систему запускається і використовується для налаштування оболонки.
~/.bashrc: executed by bash(1) for non-login shells.

  1. Перейдіть до кінця файлу і напишіть:

    sudo python mycode.py

  2. Якщо ви хочете, щоб вихід зберігався у файлі txt, відредагуйте код у кроці 3 наступним чином:

    sudo python mycode.py >> output.py

Сподіваюся, це допомагає!

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