Como autostart serviço em QUALQUER linux?

2

Eu preciso instalar o serviço mais burro possível (um binário) e executá-lo de forma confiável como o usuário atual na inicialização (ou login, qualquer que seja) em tantas plataformas quanto possível (do tipo de ponto de venda antigo). O aplicativo monitora outros arquivos gerados por outro aplicativo na sessão do usuário.

Alternativas de inicialização consideradas:

  1. init.d
  2. @reboot no crontab
  3. um arquivo .desktop em ~ / .config / autostart
  4. uma miríade de outras soluções, incluindo .profile e .bashrc

Todos os itens acima se desmembram em algum momento. Os problemas decorrem de não querer executar como root (eu quero que os arquivos gerados sejam acessados pelo usuário), e não ter uma maneira confiável de obter o nome de usuário atual no sudo em todas as plataformas. Idealmente, nem mesmo o sudo pode ser considerado disponível.

Ei, eu só quero executar algo na inicialização e tenho poder "raiz" para fazer isso. O Windows faz o trabalho com facilidade. Isso não é ciência de foguetes, é?

    
por Yan 03.06.2014 / 23:24

2 respostas

2

Eu sugeriria usar ferramentas daemon para gerenciar seus serviços.

Ele usa um supervisor para monitorar seus serviços e é executado como um daemon. Você pode escrever um script de execução simples, executar o script e as ferramentas do daemon irão desassociá-lo com o terminal atual e também fornecerá logs separados para solução de problemas.

    
por 03.06.2014 / 23:35
2

Sobre a única coisa que é garantidamente ser (um pouco) a mesma em todas as instalações do Linux é o kernel, porque o kernel é o que faz dele o Linux.

O kernel tem um parâmetro de linha de comando init que especifica o caminho e o nome do binário que é responsável por inicializar o ambiente userspace após a inicialização do kernel estar completa. Normalmente, /sbin/init é usado para esse propósito, no entanto, ele pode ser substituído por qualquer outro binário que você goste (junto com as bibliotecas necessárias, arquivos de configuração, etc.) disponíveis no sistema de arquivos raiz.

No entanto, provavelmente não é o que você deseja.

Praticamente tudo o que você faz além disso dependerá, de alguma forma, do comportamento do software instalado. Não há qualquer garantia de que o binário do init viverá em / sbin / init.

A maioria dos softwares que enfrenta este problema trabalha em torno dele, fornecendo várias configurações de init possíveis, e possui um script de instalação (ou possui o administrador) para escolher o apropriado para o sistema em questão; se nenhuma configuração apropriada for fornecida, espera-se que o administrador redija suas próprias informações.

Infelizmente, esta é a desvantagem da versatilidade que a maioria das distribuições Linux oferece. No Windows, há apenas uma maneira de fazê-lo (bem, existem alguns, mas eles são especificamente definidos pela Microsoft e você não pode realmente fazer nada para mudá-los, mesmo como um administrador competente em programadores).

The problems stem from not wanting to run as root (I want the files generated to be user-accessible)

Se esse foi seu único problema, no entanto, a solução mais fácil seria simplesmente alterar a propriedade do arquivo imediatamente após criá-lo. Ou faça o que a maioria dos daemons faz : inicie como root, então abandone os privilégios e mude para uma conta sem privilégios depois de fazer qualquer inicialização que precise ser feita como root (por exemplo, abrir sockets para escutar portas privilegiadas, ler arquivos de configuração protegidos na memória, etc.).

Eu imagino que o usuário logado pode ser programaticamente determinado, mas você precisa ser bem mais específico do que exatamente o que você quer dizer com 'usuário logado'. Detectar quais contas de usuários (se houver) estão / estão executando um determinado binário é bastante trivial, varrendo a árvore de processos, e você pode chegar perto o suficiente do que você está tentando alcançar. Depois de saber qual conta de usuário você deseja segmentar, você pode alternar seu contexto de segurança para essa conta ou iniciar um processo separado como esse usuário (semelhante a como o sudo faz seu trabalho pesado).

    
por 04.06.2014 / 16:29