Как автоматически запускать приложения при загрузке Linux

Сравнение различных механизмов запуска Linux-систем

Процесс Init.d

Init — это самый первый процесс. Он является предком всех процессов Linux и всегда имеет идентификатор процесса (PID) равный 1. Как видно на скриншоте ниже, init имеет значение PID 1.

kali> ps aux | grep init

Затем этот инициализирующий процесс передает процедуру загрузки демону rc.d.

Здесь важно отметить, что разные дистрибутивы Linux обрабатывают процесс запуска демона по-разному. В целом, все они используют процесс init как первый процесс, но то, как они передают процесс загрузки загрузочным скриптам, немного отличается. В этом случае мы будем рассматривать процесс загрузки в Kali Linux, который использует ту же процедуру, что и другие Linux-системы на базе Debian.

Первый пример

Теперь давайте попробуем написать первый скрипт. Делать это лучше на компе, а еще лучше в Linux или редакторе, который умеет создавать текстовые файлы без символа возврата каретки (который при открытии в Android будет выглядеть как ^M в конце каждой строки). Наш первый скрипт будет состоять всего из двух строк, которые делают бэкап всех установленных приложений на карту памяти. Его код (требует BusyBox):

#!/system/bin/sh mkdir /sdcard/backup cp /data/app/*.apk /sdcard/backup

Сохраняем (пусть он называется apk_) и перекидываем на смартфон с помощью ADB:

$ adb push apk_ /sdcard/

Теперь его нужно запустить. Проще всего сделать это с помощью все того же ADB:

$ adb shell sh /sdcard/apk_

Примерно таким же образом скрипт можно запустить из консоли на самом смартфоне/планшете:

Читайте также:  Windows Search — что это за служба, описание

$ sh /sdcard/apk_

Само собой, такой способ не очень удобен. Поэтому нам нужен какой-то быстрый способ запуска скрипта. Наиболее удобное из найденных мной решений — это приложение QuickTerminal. Устанавливаем, запускаем, переходим на вкладку Quick Command, нажимаем кнопку «+», вбиваем имя (произвольное) и команду (sh /sdcard/apk_), в поле Output Type выбираем либо Dialog Output, либо Nothing. В первом случае во время выполнения скрипта на экране появится окно с результатом, во втором все пройдет в фоне. Кому что удобнее. Далее сохраняем и получаем кнопку, с помощью которой скрипт можно будет запустить быстро и легко.

Теперь напишем скрипт, который восстановит наш бэкап:

Первый пример

#!/system/bin/sh for i in /sdcard/backup/*; do pm install -t -r $i done

В нем мы задействовали команду pm с опцией install и флагами -t и -r, которые заставляют систему устанавливать приложения, даже если они подписаны тестовым ключом или уже установлены. Также можно использовать флаг -s, который принуждает приложения к установке на карту памяти (если такая возможность есть), или -f — установка во внутреннюю память устройства.

Почти все команды Android имеют подробную справку

Имея рут, можно даже сделать бэкап настроек всех приложений с помощью копирования и архивации каталога /data/data/, однако восстановить его будет очень проблематично, так как в Android каждое приложение исполняется от имени созданного специально для него Linux-юзера и хранит настройки внутри каталога, принадлежащего этому пользователю. Проблема здесь в том, что идентификатор Linux-юзера для каждого приложения генерируется динамически, поэтому после восстановления бэкапа в заново установленной системе идентификаторы не будут совпадать и приложения не смогут прочитать свои настройки. Придется вручную выяснять ID юзера для каждого приложения и менять права доступа на каталоги с данными.

Читайте также:  Не могу установить хром администратор вашей сети

С другой стороны, мы можем использовать встроенный в Android Backup Manager, позволяющий сторонним приложениям использовать возможности системы для бэкапа и восстановления приложений и их данных. Управлять им можно из консоли (а значит, и с помощью скриптов), но сам по себе он никакого бэкапа не производит, а возлагает эту работу на сторонние приложения. Helium — одно из таких приложений. Если установить и настроить его, операцию бэкапа и восстановления можно будет заскриптовать. Например, следующий простой скрипт сделает резервную копию всех сторонних приложений:

#!/system/bin/sh # Получаем список всех сторонних приложений for i in `pm list packages -e`; do # Добавляем каждое из них в очередь bmgr backup ${i:8} done # Запускаем операцию бэкапа bmgr run

Конструкция ${i:8} здесь нужна, чтобы обрезать слово «packages:», которое pm добавляет в начало имени каждого пакета. Чтобы восстановить бэкап, можно использовать либо тот же Helium, либо команду bmgr:

$ bmgr list sets # Получаем список бэкапов $ bmgr restore <тег> # Восстанавливаем нужный бэкап

Отсрочка

В Убунту есть также прекрасная возможность делать отсрочку включения — прямо как на современных духовых шкафах или мультиварках. Она делается с помощью введения небольшого дополнения к тексту команды. Которое выглядит следующим образом: «sleep 20;» (без кавычек). Вместо 20 можно вписать любое число, которое будет означать количество секунд, которые процесс «спит» перед тем, как запуститься. Таким образом вы можете дать системе время полностью загрузиться, после чего уже начнут включаться определённые сервисы или программы.

Мокша через бодхи линукс

Moksha — это легкая сфокусированная настольная среда, созданная на основе Enlightenment, созданного проектом Bodhi Linux. Процесс автозапуска приложений Moksha представляется уникальной реализацией рабочего стола Moksha.

В меню Мокша перейдите к настройки > Все > Программы > Запуск приложений. Вкладка «Система» предназначена для управления системными утилитами в последовательности запуска, вкладка «Приложения» — для управления приложениями, а вкладка «Заказ» позволяет управлять порядком записей при запуске. Нажми на Приложения выберите приложение из списка и нажмите добавлять чтобы добавить его в последовательность запуска. Похоже, что нет способа добавить пользовательские команды или сценарии в инструмент, поэтому, если утилита или приложение не найдены автоматически, для их добавления может потребоваться дополнительное исследование. Если вы знаете способ сделать это уже, пожалуйста, напишите в комментариях ниже.