Что приводит к сбою команды импорта при запуске через службу
Наша служба 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 и т. д., которые гарантируют, что на сервисы не влияют произвольные значения переменных среды интерактивной оболочки (и другого состояния процесса), когда сервис запускается / выключается.