Respostas:
Se você tem um programa foo
tentando criar / gravar em um arquivo, as permissões do foo
binário não importam, mas o usuário que está executando faz toda a diferença.
Nesse caso, foo
está tentando gravar em /var/run
, que pertence root
e é gravável apenas pela raiz .
Então você teria que executar o programa sudo foo
para criar esse arquivo PID. Por favor, considere as implicações de segurança de permitir que um programa seja executado como root antes de fazê-lo ...
/var/run
Abordagem geral: determine o usuário e o grupo do processo que está tentando acessar o arquivo. Isso geralmente é encontrado na configuração do software (como servidores da web / servidores de e-mail / ...), mas se o software já estiver em execução, use isto:
ps aux
Procure o processo para o qual você deseja configurar os direitos de acesso. A primeira coluna informa sob qual nome de usuário está sendo executado.
groups <username>
Isso informará a quais grupos o usuário pertence.
Altere o proprietário ou o grupo do arquivo para corresponder ao serviço.
Nota 1: Como a pergunta indica que o arquivo está em / var / run /, estou assumindo que apenas um processo precisa de acesso, se isso não for verdade, você não deve alterar o proprietário ou o grupo, mas pode considerar adicionar o processo 'usuário ao grupo ou criando um novo grupo para este arquivo / pasta.
Nota 2: Coisas engraçadas podem acontecer com o apparmor, que é um sistema de segurança: pode impedir que os processos sejam gravados em arquivos e pastas nas quais eles têm (no nível do sistema de arquivos) todos os direitos necessários. Com aa-status
você, você pode ver se uma regra específica para o seu serviço está ativa.
O que fiz foi simplesmente adicionar a criação de uma pasta imediatamente antes da execução do start-stop-deamon. Isso funciona porque o script geralmente é executado como raiz durante a inicialização. Ele apenas cria a pasta em / var / run e altera o proprietário imediatamente, para que um PID possa ser gravado.
No exemplo abaixo, verifico a existência da subpasta de / var / run, onde coloquei os PIDs como o usuário atual, neste caso, o usuário 'pi' (já que estou com uma framboesa).
Verifique também este link, pois foi muito educativo para mim: o script Python para ser executado como serviço , no entanto, não abordou o problema discutido aqui.
Exemplo de parte do meu script de shell:
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/power/$DAEMON_NAME.pid
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
if [ ! -d /var/run/power ]; then
mkdir /var/run/power/
chown pi:pi /var/run/power/
fi
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
log_end_msg $?
}