Respuestas:
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 ...
/var/run
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.
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 $?
}