Приложение Java System Tray в Linux (Ubuntu) запускается из службы (демон)

Привет, я пишу Java-приложение для Linux (ubuntu), в котором есть приложение для лотка и служба приложений демона.

Я могу выполнить основное приложение в качестве демона, используя yajsw. При входе пользователя в систему я хочу, чтобы служба была уведомлена о том, что достигнуто (я написал скрипт и поместил его в папку /etc/profile.d/, оттуда запускается скрипт, я подключаюсь к основному приложению, используя подключение к сокету TCP, и передать имя пользователя, вошедшего в систему)

Теперь из основного приложения я хочу запустить приложение в трее на текущем рабочем столе пользователя, вошедшего в систему, в котором будет отображаться значок в трее (SystemTray из java.awt) и всплывающее меню. У меня есть отдельный файл jar, созданный для приложения в трее.


person jan_kiran    schedule 13.11.2013    source источник


Ответы (2)


Один из способов — запустить приложение в трее в другом процессе.

Process p = Runtime.
               getRuntime().
               exec(new String[]{"bash","-c","java -jar /path/to/yourjar"});

В качестве альтернативы вы можете просто использовать ОС. Gnome, KDE и Unity поддерживают автоматический запуск приложений при входе в систему. Например, в Gnome скрипты в ~/.config/autostart/ автоматически запускаются при входе в систему.

Лично я думаю, что лучший способ пойти было бы

  1. Используйте ОС для автоматического запуска приложения на панели задач при входе в систему.
  2. Во время инициализации проверьте, запущен ли демон из приложения на панели задач.
  3. Отображение ваших обновлений от демона или отображение предупреждения, если демон недоступен
person JustDanyul    schedule 13.11.2013
comment
Я использовал Processbuilder и команду как sudo -u ‹username› java -cp /path/jar mainclass. Приложение в трее запускается, и SystemTray.isSupported() возвращает false. Если я запускаю приложение в трее непосредственно из файла профиля, проблема заключается в том, что если пользователи убьют приложение, я не смогу перезапустить приложение из демона. я застрял здесь - person jan_kiran; 13.11.2013
comment
Хотя я все еще не думаю, что это правильный путь (начиная с демона), вы уверены, что он запустился на правильном дисплее? Попробуйте добавить DISPLAY=:n, где n — это номер дисплея x, на котором вы хотите, чтобы он работал. - person JustDanyul; 13.11.2013
comment
Я создал скрипт с разрешением +x для всех и выполнил скрипт с помощью построителя процессов sudo -u ‹username› /path/script.sh - person jan_kiran; 13.11.2013
comment
Но выполняете ли вы его в правильной среде. Например, если вы запускаете демон до фактического запуска x-сервера, а затем создаете процесс. У него не будет правильно установлена ​​переменная среды DISPLAY. Таким образом, внутри вашего скрипта установите DISPLAY=:0 (или любой другой дисплей, на котором вы хотите запустить программу Java) перед запуском приложения Java. - person JustDanyul; 13.11.2013
comment
В файл сценария, как было предложено, я добавил #!/bin/sh export DISPLAY=:0; java -cp /path/jar основной класс. когда первый пользователь входит в систему, SystemTray.isSupported() возвращает false, когда второй пользователь входит в систему, получая ошибку, не может подключиться к серверу X11, используя «: 0» - person jan_kiran; 13.11.2013
comment
Во-первых, могу ли я просто подтвердить, что SystemTray.isSupported() возвращает true, когда вы запускаете приложение в трее вручную? В противном случае все это зависит от настроения, и вам нужно решить другую проблему, прежде чем беспокоиться об ее автоматизации. Во-вторых, вам нужно отслеживать, какой дисплей вы используете, я только что использовал 0 в качестве примера, вы не можете просто использовать его повторно, когда несколько пользователей вошли в систему и надеются, что все они используют один и тот же дисплей. Прочтите это: support.objectplanet.com/esupport/< /а> - person JustDanyul; 13.11.2013
comment
Когда я запускаю вручную, я получаю истину, и он показывает трей для текущего пользователя. Есть ли способ, с помощью которого я могу вызвать демона после запуска рабочего стола, но я не могу поместить файл сценария в домашний каталог всех пользователей. Он должен быть на системном уровне, как папка /etc/profile.d - person jan_kiran; 13.11.2013
comment
Я очень сильно подозреваю, что это связано с тем, что он не работает с правильной комбинацией x display/user (я заметил, что вы удалили часть sudo из своего скрипта в своем последнем комментарии, просто чтобы комментарий был коротким). Несмотря на это, вам обязательно нужно убедиться, что вы запускаете команду ПОСЛЕ полной загрузки сеанса x для пользователя. Кстати, я бы не стал использовать /etc/profile.d для X-вещей. Я бы посмотрел /etc/x11/xinit/xinitrc.d - person JustDanyul; 13.11.2013

Добавлен файл сценария в /etc/X11/Xsession.d/98script, который будет вызываться при входе пользователя в систему после создания сеанса, чтобы вы могли получить значение $DISPLAY, которое важно для запуска приложения Java Tray в сеансе. Из сценария, называемого приложением daemon java, которое прослушивает порт tcp. Из приложения java daemon выполните сценарий startapp, передайте вошедшее в систему имя пользователя и его DISPLAY в сценарии startapp, экспортируйте DISPLAY и экспортируйте USERNAME и выполните приложение в трее, которое запустится пользователем сеанс и трей отображаются в одной области отображения

person Community    schedule 14.11.2013