Как запустить скрипт из автозагрузки на Raspbian 10 (buster)?

Я разработал графический интерфейс, который хочу запустить, как только включу свой Raspberry Pi. В настоящее время он настроен на автоматический вход в качестве пользователя при запуске, но если это усложнит процесс, я могу это изменить. Мой Raspi работает на Raspbian 10 (buster), что усложняет задачу, поскольку я могу найти руководства только для Raspbian 8 или около того.

Я попытался изменить папку автозапуска, но она находится не в том же месте, что и в предыдущих версиях Raspbian, и, похоже, не работает так, как раньше. В учебниках сказано создать файл .desktop в /home/pi/.config/autostart, но у меня нет папки .config или, по крайней мере, она скрыта. Для меня автозапуск находится в /etc/xdg/autostart, и когда я пытаюсь создать здесь новый файл с помощью nano в терминале, я получаю сообщение [Каталог '/etc/xdg/autostart' недоступен для записи], и он не не сохранить мой файл.

Я также пытался вызвать свой скрипт в /etc/rc.local, но это ничего не дало. Некоторые говорят, что это не работает для графических интерфейсов.

Вот что я ввожу в терминал:

$ nano /etc/xdg/autostart/gui.desktop

и появляется новый файл, но внизу я получаю предупреждение [Каталог '/etc/xdg/autostart' недоступен для записи]

Как я могу заставить свой GUI-скрипт запускаться при запуске с Raspbian 10 (buster)?


person BenS    schedule 10.09.2019    source источник


Ответы (2)


Здесь есть ряд проблем, во-первых, когда вы просматриваете учебники, знайте, что дистрибутивы Linux построены по уровням, для простоты предположим, что ваш «стек уровней» выглядит так: ядро, systemd, x11, xdg, lxde. Ядро загружается, затем запускает systemd, который затем запускает x11 (и много других вещей), x11 запускает xdg (и еще что-то, я думаю), lxde запускается либо x11, либо xdg, я не уверен, какой.

Вы хотите что-то добавить в этот процесс, вы можете сделать это на уровне ядра (плохая идея), на уровне их systemd (вероятно, неправильно, если только это не демон), на уровне x11 (все еще, вероятно, плохо, поскольку вы все еще не уже есть пользовательский сеанс) или на уровне xdg или lxde.

xdg, вероятно, является подходящим местом, так как в нем есть все, что вам нужно (графический интерфейс, пользовательский сеанс), и в то же время он распространен (возможно, xdg все еще будет работать, если вы переключите оконные менеджеры).

Учитывая это, почему ваше решение по изменению xdg не работает? Это потому, что «/etc/xdg/autostart» — это каталог конфигурации системы. Любые внесенные в него изменения будут применяться ко всем пользователям. Вы можете этого хотеть, но система пытается защитить других пользователей в вашей системе и позволяет только пользователю root вносить изменения для всех. Если вы хотите сделать это, используйте «sudo» (задокументировано в другом месте на бирже стека и в Интернете). Если вы хотите сделать это только для себя, используйте ~/.config/autostart, (https://wiki.archlinux.org/index.php/XDG_Autostart), вам может понадобиться создать этот каталог с помощью «mkdir ~/.config/», а затем «emacs ~/.config/autostart».

person Sam    schedule 10.09.2019
comment
Я запустил mkdir ~/.config и оказалось, что каталог уже существует, поэтому его нужно просто скрыть. Однако он не содержит папки автозапуска. Если я создам эту папку в ~/.config, будет ли она по-прежнему иметь функцию автоматического запуска или это будет просто новая папка с именем autostart? - person BenS; 10.09.2019
comment
Не знаю, попробовать? С компьютерами очень дешево играть. Я предполагаю, что демон/функция, выполняющая автозапуск, заглянет в /etc/xdg/autostart, а затем в ~/.config/autostart, если ничего не найдет, значит, ничего не делает, если что-то найдет, то сделает Это. - person Sam; 10.09.2019

Было бы лучше, если бы программа python запускалась в окне терминала при запуске? Таким образом, вы бы видели, что он делает в случае ошибок.

Если это так, возможно, проверьте это https://stackoverflow.com/a/61730679/7575617

Кстати, в файловом менеджере нажмите CTRL+H, чтобы переключить просмотр скрытых файлов и папок.

person Derek    schedule 12.05.2020