Что приводит к сбою команды импорта при запуске через службу

Наша служба System V запускает демон, который запускает команду импорта. Запуск нашего сервиса sudo service myservice запуск, кажется, запускает службу, но когда дело доходит до скриншота, импорт не работает. Единственный способ получить скриншот - запустить сервис с /etc/init.d/myservice Начните. После этого мы можем сделать снимок экрана командой import.

Есть идеи?

2 ответа

Решение

Нет прямого ответа на ваш вопрос, кроме "это зависит от среды", то есть дистрибутива GNU / Linux.

Прежде чем перейти к полуосуществимым деталям, вы должны знать, что причина sudo service import-image-service не работает, потому что команда импорта не имеет достаточно информации о среде, чтобы знать, где и как сделать снимок экрана. Читающий человек Судо раскрывает:

 DESCRIPTION
   sudo allows a permitted user to execute a command as the superuser or
   another user, as specified by the security policy.

Это несколько загадочно, и узнавать об этой "политике безопасности" весело, но, возможно, это не одно из ваших любимых занятий. Я даю вам слово, что это означает, что команды, начинающиеся с sudo, запускаются в изолированной среде.

По сравнению, /etc/init.d/myservice работает, потому что environment-setup-policy предпринимает шаги для настройки некоторых нормальных значений по умолчанию, таких как export DISPLAY=:0.0, Вам придется изучить тонкости используемого дистрибутива, чтобы выяснить, как правильно информировать службу о наличии X-сервера. А пока можешь попробовать sudo -E service myservice

  -E      The -E (preserve environment) option indicates to the secu‐
       rity policy that the user wishes to preserve their existing
       environment variables.  The security policy may return an
       error if the -E option is specified and the user does not
       have permission to preserve the environment.

Некоторый фон

предупреждение: этот раздел полу-фактический и исторически предвзятый

Службы в системе GNU / Linux ведут себя несколько произвольно от одного распределения к другому. Главным образом, разница заключается в настройке среды до запуска службы. Это зависит от нескольких факторов, наиболее важными из которых являются:

  • система инициализации
    • простая оболочка System V init + posix (Slackware, Debian)
    • OpenRC (Gentoo)
    • Upstart (Ubuntu)
    • systemd (много последних дистрибутивов)
  • дистрибутивы environment-setup-policy*
  • детали конкретного сценария инициализации

Debian, Slackware и Gentoo (OpenRC) используют, по-видимому, похожий подход, в котором /etc/init.d/ services являются независимыми сценариями, которые дополнительно получают дополнительную информацию из /etc/default/servicename, /etc/conf.d/servicename и аналогичных. Сценарии могут полагаться или не полагаться на специфичные для распределения функции инициализации, такие как /lib/lsb/init-functions или /lib64/rc/sh/functions.sh. Эти дополнительные библиотеки оболочки могут получать информацию (настраивать среду) из дополнительных источников, относящихся к распространению.

Ubuntu (Upstart) и systemd используют "совершенно" разные подходы, в которых у каждого сервиса есть файл конфигурации, а система init выполняет всю магию.

Чтобы полностью понять, что происходит, нужно прочитать и понять систему инициализации и особенности используемого дистрибутива.

* процесс инициализации переменных среды и запуска службы.

Это очень четко объяснено на странице руководства для старой Linux System V service в самом первом предложении:

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

Как вы думаете, что image Команда знает, где найти ваш X-сервер? Это DISPLAY переменная среды, конечно.

Не полагайтесь на то, что сервисы работают в интерактивной среде входа в систему с управляющими терминалами, DISPLAY переменные окружения и т. д. Они не. Если вы разработали сервис, основанный на этих предположениях, то вы разработали его неправильно, и вы разработали что-то, что даже сейчас не работает, не говоря уже о том, что будет работать, если вы используете другую систему инициализации, такую ​​как systemd, upstart, nosh, runit и т. д., которые гарантируют, что на сервисы не влияют произвольные значения переменных среды интерактивной оболочки (и другого состояния процесса), когда сервис запускается / выключается.

Другие вопросы по тегам