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).