Запустить определенный терминал при запуске
Я кодировал приложение, используя 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.