Preciso instalar o serviço mais estúpido possível (um binário) e executá-lo de forma confiável como o usuário atual na inicialização (ou no logon, o que for) nas 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:
- init.d
- @reboot in crontab
- um arquivo .desktop em ~ / .config / autostart
- uma infinidade de outras soluções, incluindo .profile e .bashrc
Todos os itens acima se decompõem em algum momento. Os problemas decorrem de não querer executar como root (quero que os arquivos gerados sejam acessíveis ao usuário) e não ter uma maneira de obter com segurança o nome do 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 fazê-lo. O Windows faz o trabalho com bastante facilidade. Isso não é ciência de foguetes, é?
su - joe /usr/local/bin/stupidprogram
.Respostas:
Eu sugeriria o uso de 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, para executá-lo, e as ferramentas daemon o desassociarão com o terminal atual e também fornecerão logs separados para a solução de problemas.
fonte
Sobre a única coisa que é garantida (de alguma forma) a mesma em todas as instalações Linux é o kernel, porque é o kernel que o torna Linux.
O kernel possui um parâmetro de linha de comando
init
que especifica o caminho e o nome do binário responsável por inicializar o ambiente do espaço do usuário após a inicialização do kernel. Normalmente/sbin/init
é usado para esse fim, no entanto, pode ser substituído por qualquer outro binário que você queira (que junto com as bibliotecas necessárias, arquivos de configuração etc.) está disponível no sistema de arquivos raiz.No entanto, provavelmente não é isso que você deseja.
Praticamente tudo o que você faz além disso depende, de alguma forma, do comportamento do software instalado. Não há nenhuma garantia de que o binário init fique em / sbin / init.
A maioria dos softwares que enfrentam esse problema trabalha com isso, fornecendo várias configurações possíveis de inicialização e possui um script de instalação (ou o administrador) escolhe o apropriado para o sistema em questão; se nenhuma configuração apropriada for fornecida, o administrador deverá escrever sua própria.
Infelizmente, essa é a desvantagem da versatilidade que a maioria das distribuições Linux fornece. No Windows, existe apenas uma maneira de fazê-lo (bem, existem alguns, mas eles são definidos especificamente pela Microsoft e você não pode realmente fazer nada para alterá-los, mesmo como um administrador competente para programadores).
Se esse era seu único problema, no entanto, a solução mais fácil seria simplesmente mudar a propriedade do arquivo imediatamente após a sua criação. Ou faça o que a maioria dos daemons faz: inicie como root, abandone privilégios e mude para uma conta sem privilégios depois de fazer o que a inicialização precisa ser feita como root (por exemplo, abrir soquetes para ouvir portas privilegiadas, ler arquivos de configuração protegidos na memória, etc.)
Eu imagino que o usuário conectado possa ser determinado de forma programática, mas você precisa ser muito mais específico do que exatamente você quer dizer com 'usuário conectado'. Detectar quais contas de usuário (se houver) está / está executando um binário específico é bastante trivial, varrendo a árvore de processos e pode levá-lo perto o suficiente do que você está tentando alcançar. Depois de saber qual conta de usuário segmentar, você pode alternar seu contexto de segurança para essa conta ou iniciar um processo separado como usuário (semelhante à forma como o sudo funciona).
fonte