Запустить определенный терминал при запуске

Я кодировал приложение, используя libpcap и ncurses. Очевидно, это приложение должно работать в терминале.

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

#!/bin/sh
gnome-terminal --geometry=75x36+0+0 --command="myapplication"'

Я хочу выполнить это при запуске (после того, как рабочий стол текущего вошедшего в систему пользователя обнаружился). Важно запустить это как root. В противном случае libpcap не сможет прослушивать пакеты. Я в курсе всех рисков.

Я создал следующее .service файл:

[Unit]
Description=My Application

[Service]
User=root
Type=simple
ExecStart=/usr/local/bin/myshellfile

[Install]
WantedBy=multi-user.target

И я положил это в /etc/systemd/system/myservice.service и установить его

sudo systemctl preset myservice.service

Тем не менее, это не работает. Что я здесь не так делаю? Запуск Ubuntu 16.04 в обновленном состоянии.

1 ответ

Решение

Существует несколько возможных способов запуска приложения с графическим интерфейсом (как gmome-терминал) при запуске системы, и, возможно, наиболее подходящим является использование Startup Applications (см. Также). Таким образом, приложение будет запущено при входе пользователя. (В любом другом методе мы должны экспортировать некоторые окружения рабочего стола, чтобы сделать это.)


Чтобы проверить мой ответ, я создал исполняемый файл, который называется myapp, находится в /usr/local/bin, Он добавляет только текущую дату и время в файле в /root директории, поэтому нам понадобятся права root (sudo) для запуска скрипта:

#!/bin/bash
date >> /root/date.txt

Мы можем предоставить разрешения конкретному пользователю для запуска команды без пароля через sudo, Независимо от того, принадлежит ли пользователь группе sudoers или нет. Мы можем использовать sudo visudo безопасно редактировать /etc/sudoers и добавьте одну или несколько строк следующим образом:

user1 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp
user2 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp

Лучшая идея - создать отдельный файл, например /etc/sudoers.d/myapp где поставить эти правила. Для этого воспользуемся командой: sudo visudo -f /etc/sudoers.d/myapp,

Сейчас user1 а также user2 должен быть в состоянии бежать sudo myapp без пароля.

Примечание: всегда используйте команду visudo редактировать sudoers файл, чтобы убедиться, что вы не заблокировать себя из системы - на случай, если вы случайно напишите что-то неправильное в sudoers файл. visudo сохранит ваш измененный файл во временную папку и перезапишет только реальный sudoers файл, если измененный файл может быть проанализирован без ошибок... источник.


Следующим шагом является изменение сценария запуска. Давайте назовем это myapp_startup и поместите его в тот же каталог /usr/local/bin, Содержание скрипта должно быть:

#!/bin/sh
gnome-terminal --geometry=75x36+0+0 -x bash -c "sudo myapp; exec bash"
  • Подробное объяснение вышеупомянутой команды предоставлено здесь.
  • Если вы хотите свернуть окно автоматически, используйте: этот подход.

Теперь мы можем создать запись в Startup Applications следующим образом:

  • Кроме того, мы можем изменить скрипт запуска следующим образом: sleep 3 && gnome-terminal ... запустить новое окно терминала после инициализации всего рабочего стола.
  • Когда скрипт не находится в каталоге, который добавляется к пользователю $PATH переменная (echo $PATH) мы должны использовать полный путь, например: /usr/local/bin/myapp_startup,

Дальнейшее чтение:

  • Вместо gnome-терминала, вероятно, вы можете использовать tmux ( или некоторый другой менеджер сеансов), как описано в этом ответе.

  • Кроме того, вы можете запустить скрипт запуска через Cron (или другую ограниченную среду) с помощью скрипта cron-gui-launcher.bash из этого проекта: https://github.com/pa4080/cron-gui-launcher. Этот сценарий будет ожидать входа пользователя в систему, а затем будет экспортировать все переменные DE и т. Д. Но в текущем случае конечный результат будет таким же, как мы используем Startup Application.

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