Perché viene visualizzato l'errore "Impossibile creare il file pid ... Autorizzazione negata"?


11

Se un programma richiede il permesso di scrittura come devo impostarlo con chown? In particolare, quali sarebbero le autorizzazioni del programma foo per risolvere questo errore?

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

Risposte:


7

Se hai un programma che footenta di creare / scrivere su un file, le autorizzazioni del file foobinario non contano, ma l'utente che esegue è la differenza.

In questo caso, foosta tentando di scrivere su /var/run, di proprietà roote scrivibile solo da root .

Quindi dovresti eseguire il programma sudo fooper creare quel file PID. Si prega di considerare le implicazioni di sicurezza di consentire l'esecuzione di un programma come root prima di farlo ...


se i permessi sui binari sono qualcosa: rw-rr, allora il programma sarebbe eseguibile dato che sto eseguendo il programma come root, ovvero permettendo di creare un ID di processo in / var / run?
Ankit

@Ankit: se un binario non ha affatto permessi eseguibili, non "funzionerà"; ma qualche cosa che esegue come root sarà in grado di creare un sotto pid/var/run
ish

In alternativa, scrivi il file pid altrove (molte applicazioni ti consentono di specificare il percorso del file pid).
msanford,

1

Approccio generale: determinare l'utente e il gruppo del processo che tenta di accedere al file. Questo si trova spesso nella configurazione del software (come server web / server di posta / ...), ma se il software è già in esecuzione utilizzare questo:

ps aux 

Cerca il processo per cui desideri configurare i diritti di accesso. La prima colonna indica sotto quale nome utente è in esecuzione.

groups <username>

Questo ti dirà a quali gruppi appartiene l'utente.

Modifica il proprietario o il gruppo del file in modo che corrisponda al servizio.

Nota 1: come la domanda sottolinea che il file è in / var / run / suppongo che solo un processo abbia bisogno di accesso, se questo non è vero, non dovresti cambiare il proprietario o il gruppo, ma potresti considerare di aggiungere il processo "utente del gruppo o creazione di un nuovo gruppo per questo file / cartella.

Nota 2: cose divertenti possono accadere con apparmor, che è un sistema di sicurezza: può impedire ai processi di scrivere su file e cartelle in cui hanno (a livello di filesystem) tutti i diritti necessari. Con aa-statuspuoi vedere se una regola specifica per il tuo servizio è attiva.


1

Quello che ho fatto è semplicemente aggiungere la creazione di una cartella appena prima dell'esecuzione dello start-stop-deamon. Questo funziona perché lo script viene generalmente eseguito come root durante l'avvio. Crea semplicemente la cartella in / var / run e cambia immediatamente il proprietario, quindi un PID può essere scritto.

Nell'esempio seguente, controllo l'esistenza della sottocartella di / var / run in cui inserisco i PID come utente corrente, in questo caso l'utente 'pi' (dato che sono su un lampone).

Controlla anche questo link poiché è stato molto educativo per me: lo script Python da eseguire come servizio , tuttavia, non ha coperto il problema discusso qui.

Parte di esempio del mio script 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 $?
}

Hai una versione di questo per systemd?
Artem Russakovskii,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.