2

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

Рассматриваются альтернативы запуска:

  1. init.d
  2. @ перезагрузка в crontab
  3. файл .desktop в ~/.config/autostart
  4. множество других решений, включая .profile и .bashrc

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

Эй, я просто хочу запустить что-то при загрузке, и у меня есть для этого полномочия "root". Windows выполняет свою работу достаточно легко. Это не ракетостроение, не так ли?

2 ответа2

2

Я бы предложил использовать инструменты демона для управления вашими сервисами.

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

2

Единственное, что гарантированно будет (в некоторой степени) одинаковым во всех установках Linux, - это ядро, потому что ядро - это то, что делает его Linux.

В ядре есть параметр командной строки init который указывает путь и имя двоичного файла, который отвечает за загрузку среды пользователя после завершения инициализации ядра. Обычно /sbin/init используется для этой цели, однако его можно заменить любым другим двоичным файлом, который вам нравится (который вместе с необходимыми библиотеками, файлами конфигурации и т.д.) Доступен в корневой файловой системе.

Однако, это, вероятно, не то, что вы хотите.

Практически все, что вы делаете помимо этого, каким-то образом зависит от поведения установленного программного обеспечения. Нет даже гарантии, что двоичный файл init будет жить в /sbin /init.

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

К сожалению, это является недостатком универсальности, которую обеспечивает большинство дистрибутивов Linux. В Windows есть только один способ сделать это (ну, есть несколько, но они специально определены Microsoft, и вы не можете ничего сделать, чтобы изменить их, даже будучи опытным администратором-программистом).

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

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

Я полагаю, что вошедший в систему пользователь может быть определен программно, но вам нужно быть гораздо более конкретным, чем то, что именно вы подразумеваете под «зарегистрированным пользователем». Определить, какие учетные записи пользователя (или учетные записи) (если таковые имеются) работают / работают с конкретным двоичным файлом, довольно тривиально, отсканировав дерево процессов, и может просто приблизить вас к тому, чего вы пытаетесь достичь. Как только вы узнаете, какую учетную запись пользователя выбрать, вы можете либо переключить контекст безопасности на эту учетную запись, либо запустить отдельный процесс в качестве этого пользователя (аналогично тому, как sudo выполняет свою грубую работу).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .