Por que estou recebendo o erro "falha ao criar arquivo pid ... permissão negada"?


11

Se um programa requer permissão de gravação, como devo defini-lo com chown? Especificamente, quais seriam as permissões do programa foo para resolver esse erro?

failed to create pid file '/var/run/bar.pid': Permission denied

Respostas:


7

Se você tem um programa footentando criar / gravar em um arquivo, as permissões do foobinário não importam, mas o usuário que está executando faz toda a diferença.

Nesse caso, fooestá tentando gravar em /var/run, que pertence roote é gravável apenas pela raiz .

Então você teria que executar o programa sudo foopara 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 ...


se a permissão nos binários for algo: rw-rr, o programa seria executável, pois estou executando o programa como root, ou seja, permitindo criar um ID de processo em / var / run?
Ankit

@ Ankit: se um binário não possui permissões executáveis, ele não "executa"; mas qualquer coisa que você executado como root será capaz de criar um sob pid/var/run
ish

Como alternativa, escreva o arquivo pid em outro local (muitos aplicativos permitem especificar o caminho para o arquivo pid).
msanford

1

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-statusvocê, você pode ver se uma regra específica para o seu serviço está ativa.


1

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 $?
}

Tem uma versão disso para o systemd?
Artem Russakovskii
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.