Por que estou recebendo um erro “Falha ao criar o arquivo pid… Permissão negada”?

10

Se um programa requer permissão de escrita, como devo defini-lo com chown? Especificamente, o que programaria as permissões do foo para resolver esse erro?

failed to create pid file '/var/run/bar.pid': Permission denied
    
por el_pup_le 10.08.2012 / 11:00

3 respostas

7

Se você tem um programa foo tentando criar / gravar em um arquivo, as permissões do binário foo não importam, mas o usuário ele está rodando como faz toda a diferença .

Nesse caso, foo está tentando gravar em /var/run , que pertence a root e somente gravável por raiz .

Portanto, você teria que executar o programa como 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 você fazer isso ...

    
por ish 10.08.2012 / 11:07
1

Abordagem geral: determine o usuário e o grupo do processo que está tentando acessar o arquivo. Isso é freqüentemente encontrado na configuração do software (como servidores da Web / mailservers / ...), 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 a você 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 questão aponta 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 adicionando o usuário do processo 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: ele pode impedir que processos gravem em arquivos e pastas para os quais eles possuem (em nível de sistema de arquivos) todos os direitos necessários. Com aa-status você pode ver se uma regra específica para o seu serviço está ativa.

    
por Neduz 10.08.2012 / 11:22
1

O que eu fiz é simplesmente adicionar a criação de uma pasta antes que o start-stop-deamon seja executado. Isso funciona porque o script geralmente é executado como root durante a inicialização. Apenas cria a pasta em / var / run e altera o proprietário imediatamente, assim um PID pode ser escrito.

No exemplo abaixo, eu verifico a existência da subpasta de / var / run onde coloco os PIDs como o usuário de execução atual, neste caso o usuário 'pi' (já que estou em uma framboesa).

Além disso, verifique este link, pois foi muito educativo para mim: Python para executar como serviço , no entanto, ele não cobriu 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 $?
}
    
por user2842868 03.10.2013 / 23:56