Como posso executar um aplicativo no gnome-terminal automaticamente ao inicializar?

5

Eu preciso executar um aplicativo automaticamente quando o Ubuntu é iniciado. Eu tenho este aplicativo em execução sem abrir o terminal. No entanto, este aplicativo exibe algumas informações em uma janela de terminal e, portanto, eu preciso que o aplicativo seja executado estritamente após a abertura do terminal gnome (automaticamente). Para este fim eu tentei criar um arquivo de script no init.d como é explicado aqui . O conteúdo do script é:

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

Isso funciona se eu executar o arquivo, mas não parece fazer nada quando eu reiniciar o computador. Alguém pode me dizer o que estou fazendo errado?

Obrigado antecipadamente.

    
por koco 23.05.2012 / 17:02

2 respostas

8

Não é possível criar um script que seja executado a partir de init.d e exiba uma janela gnome-terminal , porque os scripts em init.d são executados antes de haver qualquer sessão de login para exibição de um. Eles são executados antes mesmo de a interface gráfica do usuário ser executada.

Registrando em um arquivo em vez

Se você precisar executar esse script quando a máquina for inicializada, em vez de tentar exibi-lo automaticamente, deverá fazê-lo gravar sua saída em um arquivo de log. Para fazê-lo executar a saída regular e a saída de erro em um arquivo de log, faça o script da seguinte forma:

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

Substitua logfile pelo nome do arquivo de log que você deseja usar. Você pode ter esse arquivo na pasta /home/mediambient/programa ou pode colocá-lo na pasta dos arquivos de log do sistema ( /var/log ). É a sua escolha. Observe que o operador &>> anexará a saída ao final do arquivo de log. Se você quiser sobrescrever o arquivo de log toda vez, use o operador &> .

Executando comandos de um script de inicialização como um usuário que não seja root

Observe também que os scripts em init.d serão executados como root . Se você não quiser isso, mas quiser executar programa como usuário mediambient , poderá escrever o script da seguinte forma:

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

Isso executa o programa como mediambient , mas ainda registra o arquivo de log como root . Se você também quiser gravar o arquivo de log como mediambient (o que você provavelmente deve fazer se estiver colocando-o dentro da pasta base do mediambient ), você pode usar:

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

(Se você estiver interessado em saber exatamente como isso funciona, isso explica 2>&1 e isto explica tee .)

(A propósito, observe que nada neste script requer especificamente bash , que é um excelente shell interativo, mas é um pouco intensivo em recursos para usar em scripts init e background. Por algum tempo o shell padrão para executar tais scripts no Ubuntu tem sido dash , o que é muito mais leve.Se você usar #!/bin/sh em vez de #!/bin/bash , que usa o shell preferencial do sistema operacional para executar scripts de shell estilo POSIX.Para esse script, ele não usa Não importa muito, mas é um bom hábito para entrar.)

Executando o script quando um usuário faz logon graficamente, em vez de no momento da inicialização

Como alternativa, se o que você realmente precisa é que o script seja executado quando o usuário mediambient fizer logon graficamente (em vez de iniciar o computador), você poderá executar driver em uma janela gnome-terminal . Você não pode usar init.d para isso; em vez disso, você precisa usar o recurso fornecido pelo seu ambiente de área de trabalho.

Se você estiver executando um Ubuntu baseado no GNOME (com Unity, Unity 2D, GNOME Clássico / Fallback ou GNOME Shell como seu ambiente de desktop) - o que eu acho que você é, desde que você quer exibir a saída em um gnome-terminal - então você pode fazer isso pressionando Alt + F2 e executando gnome-session-properties . Isso lhe dá a oportunidade de editar seus aplicativos de inicialização. Coloque o seguinte no campo Command: :

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

Executando o script no momento da inicialização, registrando em log em um arquivo e visualizando automaticamente o log quando um usuário faz logon graficamente

Ou você pode (meio que) obter o melhor dos dois mundos colocando o script em init.d para ser executado quando o Ubuntu for iniciado, e depois gerar automaticamente uma janela gnome-terminal mostrando a saída conforme ela avança, uma vez mediambient faz login graficamente. Para fazer isso, adicione uma entrada ao Startup Applications com este comando:

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

(Ou se logfile é um caminho absoluto em vez de relativo para o arquivo de log, você pode deixar de fora --working-directory=/home/mediambient/programa .)

-n 512 significa que exibe até 512 linhas do arquivo de log antes de começar a exibir o arquivo de log. (Ele exibirá cada linha à medida que for adicionada ao arquivo de log.) Geralmente, essa é uma opção razoável, pois a janela gnome-terminal apenas lembra até 512 linhas por padrão. Se você executar gnome-terminal com um perfil modificado que se lembra de mais de 512 linhas, então você pode editar o comando tail de acordo.

Limitando o tamanho do arquivo de log

Se você estiver preocupado com o tamanho crescente do arquivo de log, a primeira coisa a fazer é descobrir se isso realmente é um problema. Você pode ser capaz de estimar. Suponha que o arquivo de log cresça em uma linha por segundo (que é muito mais rápido que a maioria dos arquivos de log) e cada linha tenha 80 caracteres. Então em um mês, o arquivo tem um tamanho pequeno de 200 MB . Em um ano, ele cresce cerca de 2,5 GB. Um par de centenas de megabytes provavelmente está bom e vários gigabytes provavelmente não estão, então a questão é: você será capaz de editar manualmente o arquivo de log para apagá-lo, pelo menos a cada poucos meses?

Se estiver mais perto de uma linha por minuto, o arquivo cresce a uma taxa menos de 50 MB por ano , caso em que você provavelmente nunca precisará se preocupar em limpar o arquivo.

Existem duas maneiras simples de limpar o arquivo. Você pode editá-lo e remover parte (ou todos) dele. Ou você pode excluí-lo e deixá-lo ser criado novamente. Se você excluí-lo, ele continuará ocupando espaço no disco até que nada mais o acesse, o que significa que você pode precisar reiniciar o driver . Você também teria que reiniciar tail , mas você pode corrigir esse problema usando um comando tail modificado que não mantém o arquivo aberto:

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

(substituí -f por --follow=name .)

Para um gerenciamento mais avançado ou automático de arquivos de log crescentes, você pode usar logrotate comando . O comando logrotate verifica se os arquivos de log excederam seu tamanho máximo ou idade e os "rotaciona", compactando-os em arquivos numerados (que são eles próprios eventualmente excluídos) e criando um novo arquivo de log. logrotate até enviará um e-mail sobre os logs, se você configurá-lo para fazer isso. A página de manual logrotate explica como gravar arquivos de configuração para informar logrotate que registra para operar.

Você pode executar logrotate automaticamente do usuário crontab de mediambient . (Um crontab lista as tarefas que são executadas em uma programação periódica pelo cron daemon .) O crontab command instala e opera em crontabs de usuário. Ou você pode adicionar uma entrada ao crontab do sistema, /etc/crontab (o que seria uma opção razoável se você estivesse executando o script em init.d e executando driver como root em vez de mediambient ). Por favor, note que os logs do sistema do Ubuntu são rodados com logrotate , embora na configuração padrão atual do Ubuntu, ele não seja chamado diretamente de nenhum crontab.

Esta visão geral da rotação de log com logrotate e agendamento de tarefas com cron deve ajudar você a começar, mas sinta-se à vontade para fazer perguntas mais detalhadas sobre AskUbuntu sobre esses tópicos ou, se preferir, comentar aqui ou editar pergunta para fornecer mais detalhes sobre o que você quer fazer (então eu posso ser capaz de dar explicações mais detalhadas sobre como fazê-lo).

    
por Eliah Kagan 23.05.2012 / 17:56
0

Você tem isso escrito:

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

O & amp; O parâmetro que está no final da linha significa que o programa será oculto. Isso é útil para executar aplicativos em segundo plano, como servidores da web de sons de inicialização, mas, no seu caso, você não deve usá-los. A solução é tão simples quanto removê-lo:

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

E eu vi que você não está usando o GNOME para autostart. Use estas instruções ao invés das do Servidor (substitua o google-chrome pelo comando acima!): Autostart do Chrome no Ubuntu

    
por espectalll 23.05.2012 / 17:10