Linux: daemons / serviços definidos pelo usuário

2

Estou procurando um framework / biblioteca / ambiente para que um usuário comum possa configurar seus próprios processos de servidor. Esses processos devem ser executados sob seu fluxo como qualquer outro processo do usuário.

No entanto, a definição de quais processos devem ser iniciados, com argumentos que eles obtêm, etc., deve ser especificada por um usuário comum sem privilégios extras. É importante para mim que isso aconteça sem a necessidade de o usuário efetuar login. O ideal é que ele funcione com o init do SYSV, mas também está tudo bem com o systemd.

Exemplos / casos de uso:

  • processos nginx uwsgi / fast cgi
  • instâncias do mongodb
  • diferentes construtores para o servidor de integração contínua

Tudo isso tem em comum, que talvez eu queira iniciar várias instâncias do mesmo binário (com parâmetros diferentes) e que esses parâmetros possam precisar de alterações regulares. No entanto, os usuários devem conseguir ajustar tudo isso sem exigir privilégios de root.

Alguma sugestão / indicação de como isso pode ser implementado no Linux?

EDIT: O requisito mínimo é apenas para iniciar os processos do usuário, mas, obviamente, haverá a necessidade de mecanismos de controle mais avançados. Por exemplo, deve haver uma maneira fácil de consultar se o serviço está em execução, parando a instância, reiniciando-a, recarregando-a, ...

    
por Felix Schwarz 17.10.2011 / 16:52

3 respostas

4

cron fornece isso com o prefixo @reboot (Vixie e talvez outros tipos, verifique man 5 crontab ). O usuário usaria crontab para criar / editar seu próprio arquivo crontab e especificar

@reboot /some/path/command -flags --moreflags

Que executará esse comando na inicialização, como esse usuário.

    
por 17.10.2011 / 17:14
3

Isso seria cerca de 10 linhas de script shell, por que você precisa de um framework / biblioteca / ambiente?

Como um exemplo rápido, usando o sysV init ....

#!/bin/bash

. /etc/rc.d/init.d/functions

. /etc/sysconfig/network

DAEMON_USERS='cat /etc/daemon_users'

CMD="$1"

for DUSER in $DAEMON_USERS ; do
   DSCRIPTS='ls /home/${DUSER}/init/'
   for DFILE in DSCRIPTS ; do
      if [ -x "/home/${DUSER}/init/${DFILE}" -a ! -d "/home/${DUSER}/init/${DFILE}" ]
      then
         su -c $DUSER /home/${DUSER}/init/${DFILE} $CMD
      fi
   done
done

Se você realmente quiser permitir que eles executem o material como root, remova o 'su -c $ DUSER' e adicione-os aos sudoers para que eles possam reiniciar / adicionar itens sem reinicializar.

    
por 17.10.2011 / 17:31
2

Então ... apenas inicie o aplicativo como o usuário que deseja executá-lo como e não tente acessar nada que exija raiz (como portas privilegiadas, arquivos que só podem ser lidos por root, etc.)?

Se você quiser iniciar esses daemons automaticamente e controlá-los através do processo init do SysV, você precisará criar um script de init para cada um que especifique os parâmetros (ou os leia de um arquivo que o usuário não privilegiado tenha escrito acesse) e inicie o daemon usando su -c ou similar, mas BEWARE : Isso tem SERIOUS segurança Implicações (um arquivo de "parâmetros" cuidadosamente elaborado pode permitir que o usuário execute código arbitrário como o usuário executando sua seqüência de inicialização, que geralmente é root).
O DerfK mencionou a opção cron @reboot , que pode ser uma escolha melhor (menos um risco de segurança), mas seus administradores precisam estar cientes de que esses programas serão iniciados pelo cron ...

    
por 17.10.2011 / 17:17