Запустить приложение при запуске
Задача:
Запустите xfce4-clipman при запуске
Пытался:
Я создал скрипт sh в нужном месте с нужными разрешениями:
martin@martin:/etc/init.d$ ls -l start_clipman.sh
-rwxrwxr-x 1 root root 26 мар 12 09:05 start_clipman.sh
Содержимое файла sh:
martin@martin:/etc/init.d$ cat start_clipman.sh
#!/bin/bash
xfce4-clipman
martin@martin:/etc/init.d$
Я побежал
martin@martin:/etc/init.d$ sudo update-rc.d start_clipman.sh
defaultsinsserv: warning: script 'K01mount_disk.sh' missing LSB tags and overrides
insserv: warning: script 'K01start_clipman.sh' missing LSB tags and overrides
insserv: warning: script 'start_clipman.sh' missing LSB tags and overrides
insserv: warning: script 'mount_disk.sh' missing LSB tags and overrides
Потенциальная проблема:
Когда я делаю это:
martin@martin:~$ xfce4-clipman
Приложение работает, но терминал занимает xfce-clipman, он выполняется, он работает, но если я хочу использовать терминал для ввода чего-то другого, я должен отменить его.
martin@martin:~$ xfce4-clipman
^C
martin@martin:~$
Что я делаю
1 ответ
xfce4-clipman требует доступа к вашему дисплею Xorg (графическая система X11) - не только потому, что это действительно графическое приложение, но и потому, что это менеджер буфера обмена, и X11 покрывает это.
(Основная) проблема: ваш дисплей Xorg на самом деле еще не доступен при запуске. Он запускается при входе в систему через некоторое время после запуска системы. Поэтому невозможно запустить xfce4-clipman "при запуске" - на самом деле вы хотите запустить приложение и при входе в систему.
(Linux создан для поддержки нескольких пользователей, которые могут входить и выходить из системы в любое время - каждый пользователь запускает совершенно новую копию Xorg, а сам экран входа в систему также получает ее. Поэтому службы не могут рассчитывать на то, что Xorg будет доступен на все.)
Запуск приложений при входе в систему
Большинство окружений рабочего стола, включая Xfce, могут запускать задачи входа в систему через *.desktop
файлы (именно так запускаются различные компоненты Xfce).
Они расположены в /etc/xdg/autostart/
для глобальных услуг, и ~/.config/autostart/
для личных. После создания он по умолчанию "включен", хотя все еще может быть отключен через xfce4-session-settings
,
Фактически, даже xfce4-clipman устанавливает свой собственный файл автозапуска в /etc/xdg/autostart - он называется xfce4-clipman-plugin-autostart.desktop
, Он должен работать автоматически, если вы используете Xfce4 (из-за OnlyShowIn=XFCE
линия).
Но если в вашей системе отсутствует этот файл или если вы хотите использовать xfce4-clipman в среде, отличной от Xfce, то вы можете создать новый. Автоматический старт .desktop
файлы обычно выглядят так:
[Desktop Entry] Type = Application Имя = Менеджер буфера обмена Exec=xfce4-clipman Terminal= ложь
Запуск не-CLI программ вручную
Во многих средах рабочего стола на AltF2 имеется диалоговое окно "Выполнить", которое позволяет запускать программы, не занимая терминал.
Различные способы сделать то же самое из терминала:
(setsid xfce4-clipman 2>/dev/null &)
(xfce4-clipman &)
nohup xfce4-clipman &
xfce4-clipman & disown
- и так далее.
Другие проблемы с вашим скриптом init.d
В ситуациях, когда системные службы являются подходящими, вы должны помнить, что файлы в /etc/init.d - это не просто простые сценарии, они также запускаются при завершении работы и должны принимать подкоманды, такие как "stop" или "restart". Когда система звонит /etc/init.d/your_service stop
, initscript должен фактически остановить сервис - не запускать его снова!
Вы пометили вопрос с помощью systemd, так почему бы не сэкономить много хлопот и написать собственный systemd *.service
файл вместо? В то время как "правильные" сценарии init.d могут заполнять несколько экранов, системные службы.services часто содержат менее десятка строк.
Еще более важно то, что в различные моменты времени существует множество десятков сервисов. На более поздних этапах доступны некоторые возможности, которых на более ранних этапах нет. (Например, сеть.)
Если в вашем начальном сценарии явно не указаны требования к его порядку ("должен выполняться до Y, но после Z"), ОС запустит его на непредсказуемой стадии, параллельно со всем остальным. Если вам очень повезет, он запустится в нужный момент, но в большинстве случаев он будет запускаться слишком рано, чтобы что-то сработало.
В собственных файлах системного модуля порядок указывается с помощью Before=
а также After=
параметры. (Это хорошая идея, чтобы указать зависимости с помощью Requires=
или же Wants=
Также.) Между тем, скрипты init.d (как с SysVinit, так и с systemd) используют специальный блок комментариев, помеченный ### BEGIN INIT INFO
с такими параметрами, как Required-Start:
а также Should-Start:
,