Executar um programa no login

5

Estou executando o Arch-Linux ARM em um Raspberry Pi.

Meu objetivo do projeto é ter um scanner de código de barras anexado ao Pi que encaminha as mensagens digitalizadas para um servidor em uma LAN.

Para proteger o sistema contra quedas de energia, etc. e minimizar a interação necessária do usuário, desejo configurá-lo para que um determinado usuário faça login automaticamente na inicialização (pronto e funciona) e um programa específico seja executado na inicialização (feito e funciona mas não como pretendido).

Eu fiz isso até agora adicionando

exec mono scannerSoftware.exe 127.0.0.1 1234 randomString

para /home/certainUser/.bash_profile , então ele é executado apenas uma vez, mesmo quando estou alternando para a raiz (em contraste com o bashrc).

O problema específico que estou tendo: Quando eu lanço o sistema, ele funciona como pretendido (login como certainUser, iniciando scannerSoftware.exe); MAS se eu quiser trocar de usuários e apertar Ctrl + C , ele reinicia o processo de login, registrando o certainUser novamente e rodando o programa novamente = > de volta para onde eu vim.

Meu palpite a respeito de por que isso acontece é que o sys detecta "login incompleto, é melhor iniciá-lo novamente".

Eu poderia contornar isso enviando Ctrl + C ao redor do login para que eu praticamente o interrompesse. Claro, isso não é uma boa prática. Basta dizer que não é prático.

Minha pergunta:
Como eu posso configurá-lo para que o programa seja executado APÓS o login ser concluído para que Ctrl + C 'me traga para um prompt bash normal como certoUser em vez de iniciar o ciclo de login sem fim?

EDIT:
Eu não estou usando nenhuma interface gráfica ou tal, apenas a linha de comando (bash on tty), porque quando feito o sistema não terá sequer um display.

    
por Mark 27.02.2014 / 09:00

4 respostas

4

As respostas dependem das suas necessidades.

Você pode querer apenas que ele inicie após um login de usuário em particular, como alternativa, você pode querer que ele seja iniciado durante a reinicialização (um serviço). ?

inicie no login

Quando você inicia um programa com exec , ele substitui o processo usado para iniciá-lo.

  • Atualmente, seu bash de login é substituído pelo seu scanner e ctrl - c envia sinal de interrupção, pára e então você está desconectado.
  • em vez de executar você pode simplesmente iniciar o programa, ele é executado em primeiro plano (você não recebe o prompt de volta). ctrl - c tem o mesmo efeito de antes, pára o scanner, mas você estará de volta no prompt bash login.
  • Você pode iniciar o processo em segundo plano, anexando & ao linha de comando, isso cria um novo processo, ainda exibe a saída seu terminal, mas você também tem um prompt do seu shell de login, então a saída do processo em segundo plano pode interferir com o seu escudo de primeiro plano. Você pode superar isso redirecionando o stdout e stderr para um arquivo (mesmo / dev / null se não é desejado), evitando a interferência.

Quando você faz logout, ainda está em execução em segundo plano, ele recebe um sinal de desconexão (mas pode detectar isso), portanto, ainda está processando em segundo plano. Se ele foi anexado ao seu terminal, ele será desanexado (a saída será descartada, a menos que você já tenha atendido o redirecionamento).

Quando você fizer o login novamente, um novo scanner será iniciado, a menos que você verifique se já existe um, e é fácil fazer isso.

iniciar durante a reinicialização

A vantagem deste método é que você não precisa fazer o login para iniciar o processo, a desvantagem é que ele está em execução o tempo todo, você pode não querer isso.

Existem 3 mecanismos principais de inicialização do sistema, init , upstart e systemd , cada um sendo diferente. Tradicionalmente /etc/rc.local seria o lugar para adicionar processos de sistema específicos da máquina.

Como WilQu menciona, Arch usa systemd , e ele forneceu uma receita para isso, então não vou repetir.

conselhos

Escreva um script para iniciar seu processo, mesmo que seja apenas uma linha, as chances são de que você queira fazer mais do que apenas executá-lo, então você pode escrever o script curto agora. (verifique se está em execução, armazene o pid, use uma string aleatória diferente com base na data? quem sabe ...).

Isso permite que você desenvolva e teste o script, executando-o manualmente e garantindo que ele funcione conforme desejado.

Depois, você pode adicionar seu script, onde quiser (manualmente, perfil de login, inicialização do sistema).

    
por 27.02.2014 / 12:40
6

Se você quiser apenas iniciar um programa na inicialização, um script de login é o lugar errado para fazê-lo.

Em vez disso, escreva um arquivo unitário systemd (já que o Arch parece usar o systemd).

Crie /etc/systemd/system/scanner.service (ou whatever.service ):

[Unit]
Description=(description of your program)

[Service]
ExecStart=/usr/bin/mono /path/to/scannerSoftware.exe 127.0.0.1 1234 randomString

[Install]
WantedBy=multi-user.target

e execute systemctl daemon-reload .

Execute systemctl enable scanner.service para executá-lo na inicialização.

Você pode iniciar e pará-lo manualmente com systemctl start scanner.service e systemctl stop scanner.service e ver seu status com systemctl status scanner.service .

Veja Ajuda do Arch Linux sobre o systemd

    
por 27.02.2014 / 11:43
1

Depende do seu DE, mas na maioria dos casos, você precisa colocar seu comando no arquivo ~/.xinitrc .

.bash_profile é para bash (como ele chamou). Se você não executar o bash, o conteúdo do .bash_profile não será executado.

    
por 27.02.2014 / 09:12
0

se você usar bash shell , use: ~/.bash_profile

se você usar Tenex C shell ou mesmo TCSH , use: ~/.login

se você usar C shell , use: ~/.login

se você usar Z shell , use: $ZDOTDIR/.zlogin

se você usar Korn shell , use: ~/.profile

Eu respondo uma resposta melhor em Diferença entre ~ / .profile e ~ / .bash_profile

    
por 27.02.2014 / 09:34