Я исследовал это, и ответ Гравити кажется устаревшим. Теперь вы можете настроить пользовательские сервисы с помощью systemd, которые выполняются как часть сеанса пользователя. Для них могут быть установлены DISPLAY и XAUTHORITY (в настоящее время это Arch и Debian Stretch).
Это имеет смысл по сравнению с предыдущими рекомендациями по использованию файлов автозапуска на рабочем столе, поскольку вы получаете управление процессами так же, как и приложение системного уровня (перезапуск и т. Д.).
Лучшие документы прямо сейчас - это Arch wiki; Systemd / Пользователь
Версия TLDR;
- Создайте нужный файл * .service в
~/.config/systemd/user/
- Выполнить
systemctl --user enable [service]
(исключить суффикс .service)
- При желании запустить,
systemctl --user start [service]
чтобы начать сейчас
- Используйте,
systemctl --user status [service]
чтобы проверить, как это происходит
Пара других полезных команд.
systemctl --user list-unit-files
- просмотреть все пользовательские блоки
- s
ystemctl --user daemon-reload
- если вы редактируете файл .service
-- Потом...
Я обновил и преобразовал большинство моих сессионных демонов в файлы systemd .service. Так что я могу добавить пару дополнительных заметок.
По умолчанию не было подключений для запуска служб при входе в систему, поэтому вы должны запустить его самостоятельно. Я делаю это из моего файла ~ / .xsession.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
Первая строка импортирует некоторые переменные окружения в сеанс пользователя systemd, а вторая запускает цель. Мой файл xsession.target;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Мой xbindkeys.service в качестве примера.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
Обычный намек - «не надо».
redshift
это не общесистемная служба - у нее будет отдельный экземпляр для каждого сеанса , и ему нужно знать, как подключиться к Xorg этого конкретного сеанса.(Xorg также не является системной службой - есть только диспетчер дисплеев , и он также запускает отдельный Xorg для каждого сеанса. //
graphical.target
сообщит вам, когда диспетчер дисплеев готов, но ничего не говорит о том, когда DM фактически запускает первый - или все - отображает.)DISPLAY=:0
Недостаточно просто запустить его при загрузке с помощью , поскольку нет никакой гарантии, что в каждый момент времени будет отображаться только один дисплей, или он всегда есть:0
(например, если Xorg дает сбой, оставляя устаревший файл блокировки, следующий запускается так,:1
как он подумал бы:0
еще занято); вам также нужно указать путь кXAUTHORITY
файлу, поскольку X11 требует аутентификации; и убедитесь, чтоredshift
перезапустите, если вы когда-нибудь выйдете из системы и войдите снова.Так с чего начать? Почти всегда в среде рабочего стола есть несколько способов запуска собственных сервисов сессий . Смотрите более старый пост, который уже описывает два обычных;
~/.xprofile
сценарий и~/.config/autostart/*.desktop
место.Если вы используете startx , вы можете использовать
~/.xinitrc
для запуска таких вещей. Автономные оконные менеджеры часто имеют свои собственные сценарии запуска / инициализации; например~/.config/openbox/autostart
для Openbox.Общим для всех этих методов является то, что программа запускается изнутри сессии, избегая всех проблем, перечисленных выше.
источник
Вот то, что я только что создал как обходной путь для еще не доступных
graphical-session.target
(В моей системе Kubuntu 16.04):Создать
~/.config/systemd/user/xsession.target
со следующим содержанием:Расскажите systemd об этом новом модуле:
xsession.target
помощью доступной в настоящее время механики рабочего стола Ubuntu 16.04.Создать
~/.config/autostart-scripts/xsession.target-login.sh
со следующим содержанием:Создать
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
со следующим содержанием:Сделайте скрипты исполняемыми:
Примечание: эти два файла размещены там, где KDE подберет их для автоматического запуска и завершения работы. Файлы могут быть размещены где-то еще для других сред рабочего стола (например, Gnome) - но я не знаю об этих средах.
Примечание. В этом обходном пути отсутствует поддержка нескольких рабочих столов. Он
graphical-session.target
корректно обрабатывает только то время, пока на машине запущен только один активный сеанс X11 (но это относится к большинству из нас, пользователей Linux).graphical-session.target
и обеспечьте их бесперебойную работу при входе в систему на рабочем столе.Например, модуль @ mkaito должен выглядеть так:
(Не забудьте сделать
daemon-reload
после редактирования ваших единиц!)В какой-то будущий день (это будет Ubuntu 17.04?) Мой обходной путь устареет, поскольку система
graphical-session.target
сама справится с этим правильно. В этот день просто удалите скрипт автозапуска и завершения работы, а такжеxsession.target
- ваши пользовательские пользовательские блоки могут остаться нетронутыми и просто работать.источник
Это решение делает именно то, что задает автор вопроса:
Хотя могут быть более эффективные способы сделать это, как уже отвечали другие пользователи, это еще один подход к этой проблеме.
Это похоже на systemd -networkd-wait-online.service systemd, который блокирует, пока не будут выполнены определенные критерии. Другие сервисы, которые зависят от него, будут запущены, как только этот сервис запустится успешно или истечет время ожидания.
Согласно инструкции (раздел «Файлы»), X-сервер создаст сокет UNIX
/tmp/.X11-unix/Xn
(гдеn
находится номер дисплея).Контролируя наличие этого сокета, мы можем определить, что сервер для определенного дисплея запущен.
confirm_x_started.sh
:x_server_started.service
:Теперь включите одновременный
x_server_started.service
запуск с X-сервером.Сделайте так, чтобы другие службы (для которых требуется запуск X-сервера) зависели от
x_server_started.service
зависимая единица:
Если X-сервер запускается без проблем,
x_server_started.service
он запустится почти сразу, и systemd продолжит запуск всех модулей, от которых зависитx_server_started.service
.источник