¿Por qué recibo el error "Error al crear el archivo pid ... Permiso denegado"?

11

Si un programa requiere permiso de escritura, ¿cómo debo configurarlo con chown? Específicamente, ¿cuáles serían los permisos del programa foo para resolver este error?

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

Respuestas:

7

Si tiene un programa que foointenta crear / escribir en un archivo, los permisos del foobinario no importan, pero el usuario que está ejecutando hace toda la diferencia.

En este caso, fooestá intentando escribir en /var/run, que es propiedad rooty solo puede escribir por root .

Por lo tanto, tendría que ejecutar el programa sudo foopara crear ese archivo PID. Tenga en cuenta las implicaciones de seguridad de permitir que un programa se ejecute como root antes de hacerlo ...

ish
fuente
si el permiso en los binarios es algo: rw-rr, entonces, ¿sería ejecutable el programa dado que lo estoy ejecutando como root, es decir, permitiendo crear una identificación de proceso en / var / run?
Ankit
@Ankit: si un binario no tiene permisos ejecutables, no se "ejecutará"; pero cualquier cosa que ejecute como root podrá crear un pid bajo/var/run
ish
Alternativamente, escriba el archivo pid en otro lugar (muchas aplicaciones le permiten especificar la ruta al archivo pid).
msanford
1

Enfoque general: determine el usuario y el grupo del proceso que intenta acceder al archivo. Esto a menudo se encuentra en la configuración del software (como servidores web / servidores de correo / ...), pero si el software ya se está ejecutando, use esto:

ps aux 

Busque el proceso para el que desea configurar los derechos de acceso. La primera columna le dice con qué nombre de usuario se está ejecutando.

groups <username>

Esto le dirá a qué grupos pertenece el usuario.

Cambie el propietario o grupo del archivo para que coincida con el servicio.

Nota 1: Como la pregunta señala que el archivo está en / var / run / supongo que solo un proceso necesita acceso, si esto no es cierto, no debe cambiar el propietario o el grupo, pero podría considerar agregar el proceso 'usuario al grupo o creando un nuevo grupo para este archivo / carpeta.

Nota 2: pueden ocurrir cosas divertidas con apparmor, que es un sistema de seguridad: puede evitar que los procesos escriban en archivos y carpetas a los que tienen (en el nivel del sistema de archivos) todos los derechos necesarios. Con aa-statususted puede ver si una regla específica para su servicio está activa.

Neduz
fuente
1

Lo que hice fue simplemente agregar la creación de una carpeta justo antes de que se ejecute start-stop-deamon. Esto funciona porque el script generalmente se ejecuta como root durante el inicio. Simplemente crea la carpeta en / var / run y cambia el propietario de inmediato, por lo que se puede escribir un PID.

En el siguiente ejemplo, verifico la existencia de la subcarpeta de / var / run donde pongo los PID como el usuario de ejecución actual, en este caso el usuario 'pi' (ya que estoy en una frambuesa).

También revise este enlace ya que fue muy educativo para mí: el script Python para ejecutarse como servicio , sin embargo, no cubrió el problema discutido aquí.

Porción de ejemplo de mi 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 $?
}
usuario2842868
fuente
¿Tienes una versión de esto para systemd?
Artem Russakovskii