Выполнить скрипт при запуске


188

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

Я пытался найти простое решение (например, сбросить мой скрипт в какой-то каталог «автозагрузка» или что-то подобное), но я не вижу ничего подобного.

Я посмотрел в Upstart , но я изо всех сил пытаюсь понять, как это работает. Любые скрипты, которые я пробовал, не работали, когда я их тестировал.


4
Какую операционную систему вы используете? В FreeBSD, которую я использую на своем Pi, вы можете добавить сценарии запуска в /usr/local/etc/rc.d/ или просто добавить что-нибудь в /etc/rc.local. Различные дистрибутивы Linux имеют разные рекомендуемые методы. Если вы используете X на нем, то вам стоит подумать о добавлении чего-либо в ваш файл .xinitrcили .xsessionфайл.
Готи

Более подробную информацию о процессе запуска X можно найти здесь .
Готи

6
Обратите внимание, что принятый ответ здесь имеет некоторые предостережения и технически не запускает ничего при загрузке, кроме как при определенных условиях. Прочитайте это внимательно.
Златовласка

Вы запрашиваете скрипт, который запускается при входе в систему, а не при загрузке pi или при запуске. Две очень разные вещи, и название искажает результаты поиска Google.
1

Ответы:


196

Для запуска 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 также выявляет ошибки, но очень важно убедиться, что сценарий в первую очередь
сложен

7
.bashrcне читается при загрузке системы или когда пользователь входит в систему , только при открытии нового терминала (и читается каждый раз, когда пользователь открывает новый терминал). Я сбит с толку, что этот ответ получил так много голосов: первая часть совершенно неверна . Третья часть правильна для выполнения программы с графическим интерфейсом.
Жиль

46

Я видел, как большинство людей делают это (заглянули на форумы Raspberry Pi), и с успехом справились /etc/rc.local.

Все, что вам нужно сделать, это поместить ./myscriptв текстовый файл rc.local. Если это в питоне, поставь python myscript.py.

Это буквально «простое решение (например, добавление моего скрипта в какую-то директорию« запуска »или что-то подобное)» - возможно, поиск по форумам, когда у вас также возникают вопросы, это решение появилось в первых 4 результатах поиск Гугл!


4
К вашему сведению, rc.local по умолчанию содержит различные комментарии о том, что скрипт ничего не делает и требует изменения исполняемых битов. Это не так, просто введите команду для вашего скрипта до выхода 0, и он запустится при запуске. Убедитесь, что ваш скрипт завершает работу в фоновом режиме, иначе он заблокирует приглашение на вход. Да, вот что я сделал.
ограбить


@rob Вы имеете в виду, что они предлагают установить скрипт как исполняемый? Это смягчается в вопросе путем запуска сценария командой python myscript.py. Если вы хотите chmod + x и добавить его #! /bin/python, вы можете запустить скрипт, выполнив команду « $pathtofile/myscript.pyгде $pathtofileесть», .если вы находитесь в той же директории, или укажите абсолютный или относительный путь к файлу.
JFA

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

1
@ ErickM.Sprengel Используйте один из правильных ответов в этой теме, например, этот .
Жиль

32

Добавьте его в crontab

Crontab запускает команды в определенное время.


Отредактируйте файл:

sudo crontab -e

Добавьте строку в файл (здесь скрипт Python):

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

2
Чтобы быть немного придирчивым здесь, технически это не crontab, который выполняет команду, но в любом случае. Что касается перечисленной строки для добавления, желательно указать полные пути для команд, определенных здесь (в данном случае полный путь к python3), см. Здесь
Ghanima

Это метод, который я всегда использовал из-за своей простоты. +1
Патрик Кук

Это плохо для программы с графическим интерфейсом, такой как браузер. /etc/rc.localтолько для запуска программ, которые не имеют пользовательского интерфейса.
Жиль

2
Потратив много времени, пытаясь заставить его работать с rc.local и init.d и всеми другими вещами ... это сработало сразу! Спасибо всем!
Петр Кула

4
это почему-то не работает в rpi os
Денис

11

Автозапуск приложений xorg

Если скрипт, который вы хотите запустить, требует сеанса xorg, вы можете попробовать следовать спецификации автоматического запуска freedesktop, которая может работать или не работать в зависимости от используемой среды рабочего стола.

Кроме того, вы можете настроить таргетинг на свою конкретную рабочую среду, как описано на странице https://wiki.archlinux.org/index.php/autostarting .

Запуск сценария как службы systemd

Если ваш сценарий соответствует описанию демона или «службы», и ваша система работает под управлением systemd, как в случае с raspbian и большинством современных версий, тогда вы можете настроить свой сценарий для запуска в качестве службы systemd - это обеспечивает детальный контроль над жизненный цикл и среда выполнения, а также предварительные условия для (повторного) запуска сценария, такие как работоспособность и работоспособность сети. Также возможно настроить перезапуск службы в случае сбоя ( 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может помочь определить причину сбоя скрипта. Как правило, всегда используйте абсолютные пути для всего, включая 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

sudo leafpad /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», введите «sudo nano /etc/rc.local» и введите путь к файлу .sh

до

exit 0

Или вы можете просто ввести

crontab -e

или же

sudo crontab -e 

если вы хотите, чтобы скрипт запускался при запуске

внутри типа файла в

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

2
Использование полных путей настоятельно рекомендуется для записей в crontab!
Ганима

-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. Сохраните ваш файл в домашнем каталоге raspberry pi. Например: mycode.py
  2. Отредактируйте файл:

    sudo nano .bashrc

.bashrcэто НЕ предназначен для запуска сценариев.

Он запускается каждый раз, когда запускается интерактивная оболочка без входа в систему, и используется для настройки оболочки.
~/.bashrc: executed by bash(1) for non-login shells,

  1. Перейти в конец файла и написать:

    sudo python mycode.py

  2. Если вы хотите, чтобы выходные данные были сохранены в текстовом файле, отредактируйте код на шаге 3 следующим образом:

    sudo python mycode.py >> output.py

Надеюсь это поможет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.