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

5

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

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

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

Спасибо заранее.

    
задан koco 23.05.2012 в 17:02
источник

2 ответа

8

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

Вход в файл вместо

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

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

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

Выполнение команд из сценария инициализации как% root User

Также обратите внимание, что скрипты в 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 , что является отличной интерактивной оболочкой, но немного ресурсоемким для использования для сценариев init и background. В течение довольно длительного времени оболочка по умолчанию для запуск таких скриптов в 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 , показывающее результат по мере его продвижения, co_de% logs графически. Для этого добавьте запись в Startup Applications с помощью этой команды:

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

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

--working-directory=/home/mediambient/programa означает, что он отображает до 512 строк файла журнала до того, как он начал отображать файл журнала. (Он будет отображать каждую строку, поскольку она добавляется в файл журнала.) Обычно это разумный выбор, так как окно -n 512 запоминает до 512 строк по умолчанию. Если вы запустите gnome-terminal с измененным профилем, который запоминает более 512 строк, вы можете соответствующим образом отредактировать команду gnome-terminal .

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

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

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

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

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

(Я заменил tail на -f .)

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

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

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

    
ответ дан Eliah Kagan 23.05.2012 в 17:56
0

У вас написано:

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

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

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

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

    
ответ дан espectalll 23.05.2012 в 17:10