Как автоматически запустить приложение в gnome-терминал при загрузке?

Мне нужно запускать приложение автоматически при запуске Ubuntu. Я запустил это приложение, не открывая терминал. Однако это приложение отображает некоторую информацию в окне терминала, и поэтому мне нужно, чтобы приложение запускалось строго после открытия gnome-терминала (автоматически). С этой целью я попытался создать файл сценария в init.d, как это объяснено здесь . Содержание сценария:

#!/bin/bash
cd /home/mediambient/programa 
/usr/bin/gnome-terminal -e ./driver &

Это работает, если я запускаю файл, но, похоже, ничего не делает, когда я перезагружаю компьютер. Может кто-нибудь сказать мне, что я делаю не так?

Заранее спасибо.

5
задан 23 May 2012 в 19:10

2 ответа

Вы написали:

/usr/bin/gnome-terminal -e ./driver &

& amp; Параметр, который находится в конце строки, означает, что программа будет скрыта. Это полезно для запуска фоновых приложений, таких как веб-серверы загрузочных звуков, но в вашем случае вы не должны его использовать. Решение так же просто, как удалить его:

/usr/bin/gnome-terminal -e ./driver

И я увидел, что вы не используете GNOME для автозапуска. Используйте эти инструкции вместо серверных (замените google-chrome на приведенную выше команду!): Автозапуск Chrome в Ubuntu

0
ответ дан 23 May 2012 в 19:10

Вы не можете создать сценарий, который запускается из init.d и отображает окно gnome-terminal, потому что сценарии в init.d запускаются до того, как есть какой-либо сеанс входа в систему, чтобы отобразить его. Они запускаются еще до запуска графического интерфейса пользователя.

Вместо этого ведение журнала в файл

Если вам нужно запустить этот скрипт при загрузке машины, то вместо того, чтобы пытаться автоматически отображать текст, вы должны сделать так, чтобы он записывал свои выходные данные в файл журнала. Чтобы он выполнял как обычный вывод, так и вывод ошибок в файл журнала, сделайте скрипт следующим образом:

#!/bin/bash
cd /home/mediambient/programa
./driver &>> logfile

Замените logfile на имя файла журнала, который вы хотите использовать. Возможно, этот файл находится в папке /home/mediambient/programa или вы можете поместить его в папку для файлов системного журнала (/var/log). Это твой выбор. Обратите внимание, что оператор &>> добавит вывод в конец файла журнала. Если вы хотите, чтобы файл журнала перезаписывался каждый раз, вместо этого следует использовать оператор &>.

Запуск команд из сценария инициализации от имени пользователя root

Также обратите внимание, что сценарии в init.d будут выполняться как root. Если вы этого не хотите, но вместо этого хотите запустить programa от имени пользователя mediambient, вы можете написать скрипт следующим образом:

#!/bin/bash
cd /home/mediambient/programa
sudo -u mediambient ./driver &>> logfile

Программа запускается как mediambient, но все равно записывает файл журнала как root. Если вы также хотите записать файл журнала как mediambient (что вам, вероятно, следует сделать, если вы помещаете его в домашнюю папку mediambient), вы можете использовать:

#!/bin/bash
cd /home/mediambient/programa
sudo -u mediambient ./driver 2>&1 | sudo -u mediambient tee logfile > /dev/null

(Если вас интересует, как именно это работает, это объясняет 2>&1 и это объясняет tee .)

(Кстати, обратите внимание, что ничего в этом сценарии специально требуется bash, который является превосходной интерактивной оболочкой, но немного ресурсоемким для использования для сценариев инициализации и фоновых сценариев. В течение некоторого времени оболочкой по умолчанию для запуска таких сценариев в Ubuntu была dash, гораздо более легкий. Если вы используете #!/bin/sh вместо #!/bin/bash, который использует предпочтительную оболочку ОС для запуска сценариев оболочки в стиле POSIX. Для этого сценария это не имеет большого значения, но это хорошая привычка, чтобы попасть в .)

Запуск сценария, когда пользователь входит в систему графически, а не во время загрузки

В качестве альтернативы, если вам действительно нужно, чтобы скрипт выполнялся при входе пользователя mediambient графический союзник (а не когда компьютер запускается), тогда вы можете запустить driver в окне gnome-terminal. Вы не можете использовать init.d для этого; вместо этого вы должны использовать средство, предоставляемое вашей рабочей средой.

Если вы используете Ubuntu на основе GNOME (с Unity, Unity 2D, GNOME Classic / Fallback или GNOME Shell в качестве среды рабочего стола) - как вы, наверное, хотите, так как вы хотите отобразить вывод в gnome-terminal - тогда вы можете сделать это, нажав Alt + F2 и запустив gnome-session-properties. Это дает вам возможность редактировать ваши приложения запуска. Введите в поле Command: следующее:

gnome-terminal --working-directory=/home/mediambient/programa -e ./driver

Запуск сценария во время загрузки, ведение журнала в файл и автоматический просмотр журнала при графическом входе пользователя в систему

Или вы можете (в некотором роде) получить лучшее из обоих миров, поместив скрипт в init.d для запуска при первом запуске Ubuntu, а затем автоматически порождая окно gnome-terminal, отображающее вывод по мере его выполнения, один раз mediambient входит в систему графически. Для этого добавьте в Startup Applications запись с помощью этой команды:

gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 -f logfile

(Или если logfile является абсолютным, а не относительным путем к файлу журнала, то вы можете пропустить --working-directory=/home/mediambient/programa.)

-n 512 означает, что он отображает до 512 строк файла журнала до того, как он начал отображать файл журнала. (Затем будет отображаться каждая строка по мере ее добавления в файл журнала.) Обычно это разумный выбор, поскольку в любом случае окно gnome-terminal запоминает до 512 строк по умолчанию. Если вы запустите gnome-terminal с измененным профилем, который запоминает более 512 строк, вы можете соответственно отредактировать команду tail.

Ограничение размера файла журнала

Если вы обеспокоены растущим размером файла журнала, первое, что нужно сделать, это выяснить, действительно ли это может быть проблемой , Вы можете просто быть в состоянии оценить. Предположим, что файл журнала увеличивается на одну строку в секунду (что намного быстрее, чем большинство файлов журнала), и каждая строка имеет длину 80 символов. Затем через месяц размер файла составляет около 200 МБ . Через год он увеличивается примерно до 2,5 ГБ. Пара сотен мегабайт, вероятно, хорошо, а несколько гигабайт, вероятно, нет, поэтому вопрос в том, сможете ли вы вручную редактировать файл журнала, чтобы очистить его, по крайней мере, каждые несколько месяцев?

Если он ближе к одна строка в минуту, затем файл увеличивается со скоростью менее 50 МБ в год , и в этом случае вам, вероятно, никогда не придется беспокоиться об очистке файла.

Есть два простых способа очистить файл. Вы можете отредактировать его и удалить часть (или всю) из него. Или вы можете удалить его, и пусть он будет создан снова. Если вы удалите его, он будет продолжать занимать место на диске до тех пор, пока к нему больше не будет доступа, что означает, что вам может потребоваться перезагрузка driver. Вам также нужно было бы перезапустить tail, но вы можете решить эту проблему с помощью модифицированной команды tail, которая не оставляет файл открытым:

gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 --follow=name logfile

(я заменил -f с --follow=name.)

Для более сложного или автоматического управления растущими файлами журналов вы можете использовать команду logrotate . Команда logrotate проверяет, не превышают ли файлы журнала их максимальный размер или возраст, и «вращает» их, сжимая их в пронумерованные архивы (которые сами в конечном итоге удаляются) и создавая новый файл журнала. logrotate даже отправит вам электронное письмо о журналах, если вы настроите его для этого. На странице руководства logrotate объясняется, как писать файлы конфигурации, чтобы сообщить logrotate, какие журналы будут работать.

Вы можете запустить logrotate автоматически из пользовательского crontab mediambient. (В crontab перечислены задачи, которые периодически выполняются демоном cron .) Команда crontab устанавливает и работает с пользовательскими crontabs. Или вы можете добавить запись в системный crontab, /etc/crontab (что было бы разумным выбором, если вы запускаете скрипт в init.d и запускаете driver как root, а не как mediambient ). Обратите внимание, что системные журналы Ubuntu вращаются с помощью logrotate, хотя в текущей конфигурации Ubuntu по умолчанию он не вызывается напрямую из любого crontab.

Этот обзор ротации журналов с помощью logrotate и планирования задач с помощью cron должен помочь вам начать работу, но вы можете задавать более подробные вопросы в AskUbuntu по этим темам или, если хотите, комментировать здесь или редактировать свои вопрос, чтобы предоставить более подробную информацию о том, что вы хотите сделать (тогда я смогу дать более подробные объяснения о том, как это сделать).

0
ответ дан 23 May 2012 в 19:10

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

Похожие вопросы: