Executando um script Ruby uma vez no login do Linux

2

Eu tenho um script Ruby que demora um pouco para ser executado (5 a 20 segundos na maioria dos casos) e sua finalidade é gerar arquivos de configuração para o Conky e o Fluxbox.

No momento, tenho o script Ruby configurado para ser executado durante a inicialização do Fluxbox, adicionando-o ao arquivo ~/.fluxbox/startup , mas isso causa um atraso na inicialização do Fluxbox, já que os arquivos de configuração precisam ser gravados antes de permitir que o Fluxbox começar.

A maneira que eu geralmente uso meu laptop é fazer o login no shell do terminal ( bash ) executando apenas startx para obter um ambiente gráfico quando eu precisar dele. Ao fazer isso, eu estava procurando uma maneira de executar meu script no login em segundo plano, mas só execute uma vez . Isso significa que, para quaisquer outros shells gerados, ele não executará meu script. Além disso, eu preciso que isso seja executado apenas para um usuário específico quando fizerem login.

Quais são minhas opções? Meu script permite a edição de arquivos de configuração de usuários específicos para que eu possa executar meu script na inicialização pelo usuário root (Ex: Um script de inicialização definido no nível de execução padrão ... Se eu conseguir que o Ruby funcione com o init sem travar a seqüência de inicialização como ele faz fluxbox, ou talvez rc.local?). Caso contrário, existe uma maneira de fazer o script rodar uma vez, apenas no login inicial de um usuário específico?

Qualquer ajuda seria apreciada.

    
por user613083 03.07.2016 / 19:51

2 respostas

2

Parece que ele precisa ser executado quando o sistema chega ao nível de execução 3 . Tente mover seu script para /etc/rc3.d/S50scriptname

    
por 03.07.2016 / 20:36
1

Minha ideia geral:

Execute o script em .bashrc em segundo plano:

/foo/bar/script &

ou talvez uma alternativa melhor:

nohup /foo/bar/script &

O script deve verificar se outra instância foi iniciada, deve sair silenciosamente em caso afirmativo. Eu não sei Ruby mas deve ser possível (caso não seja: construa o script "wrapper" no Bash que faz a checagem e executa seu script Ruby ou não). Formas gerais podem ser: ps -like query, ou bloquear file dir (consulte this ) em /dev/shm ou /run/shm ( /dev/shm está na memória e será limpo na próxima reinicialização - perfeito). Caso contrário, o script deve:

  • ( ps -método de consulta semelhante) faz seu trabalho e nunca sai (um loop de espera infinito de baixo custo de algum tipo?);
  • (método lock dir) crie o diretório de bloqueio, faça seu trabalho e saia.

Dessa forma, ele será executado apenas uma vez.

Se você escolher ps -like query method, tenha em mente que seu script será eliminado no logout, a menos que você use nohup .

Editar:

Em um ambiente multiusuário geral, alguns usuários do rouge A podem bloquear o script do usuário B criando o diretório de bloqueio. Você pode criar um diretório de bloqueio dentro de ~/ para evitar esse cenário, mas deve excluí-lo no momento certo. A solução ps não deve ser propensa a este problema.

A solução com /etc/rc3.d (resposta de Glenn Jackman) pode estar bem. Sua vantagem: ele será executado uma vez fora da caixa. Existem diferenças entre as duas soluções e você deve saber sobre isso (nem todas elas serão relevantes para você em particular, mas no caso geral):

  1. .bashrc é executado como usuário específico (normalmente: não-raiz); scripts sob rc3.d serão executados como root, o que é potencialmente mais perigoso em caso de um acidente.
  2. Você não precisa de acesso root para implementar .bashrc solution (embora seu script possa precisar dele).
  3. Vários usuários podem implementar .bashrc soluções e não sobrecarregarão seu sistema, a menos que façam login simultaneamente.
  4. Na minha opinião, é a coisa certa implementar soluções específicas do usuário no nível do usuário ( .bashrc ), não o nível do sistema ( rc3.d ).
por 03.07.2016 / 20:37