Réponses:
Si un programme foo
essaie de créer / écrire dans un fichier, les autorisations du foo
binaire n'ont pas d'importance, mais l'utilisateur qu'il exécute fait toute la différence.
Dans ce cas, foo
essaie d'écrire sur /var/run
, qui appartient à root
et n'est accessible en écriture que par root .
Il vous faudrait donc exécuter le programme sudo foo
pour créer ce fichier PID. Veuillez considérer les implications de sécurité de permettre à un programme de s'exécuter en tant que root avant de le faire ...
/var/run
Approche générale: déterminer l'utilisateur et le groupe du processus essayant d'accéder au fichier. Ceci est souvent trouvé dans la configuration du logiciel (tels que les serveurs Web / mailservers / ...), mais si le logiciel est déjà utilisé en cours d'exécution ceci:
ps aux
Recherchez le processus pour lequel vous souhaitez configurer les droits d'accès. La première colonne vous indique dans les noms d'utilisateur, il est en cours d'exécution.
groups <username>
Cela vous indiquera à quels groupes appartient l'utilisateur.
Modifiez le propriétaire ou le groupe du fichier pour qu'il corresponde au service.
Remarque 1: Comme la question souligne que le fichier se trouve dans / var / run / je suppose qu'un seul processus a besoin d'accès, si ce n'est pas vrai, vous ne devriez pas changer de propriétaire ou de groupe, mais vous pourriez envisager d'ajouter le processus 'utilisateur au groupe ou en créant un nouveau groupe pour ce fichier / dossier.
Remarque 2: des choses amusantes peuvent se produire avec apparmor, qui est un système de sécurité: il peut empêcher les processus d'écrire dans des fichiers et des dossiers sur lesquels ils ont (au niveau du système de fichiers) tous les droits nécessaires. Avec aa-status
vous pouvez voir si une règle spécifique pour votre service est actif.
Ce que je n'est d'ajouter simplement la création d'un dossier juste avant le start-stop-daemon est exécuté. Cela fonctionne parce que le script est généralement exécuté en tant que root lors du démarrage. Il crée simplement le dossier dans / var / run et change immédiatement le propriétaire, donc un PID peut être écrit.
Dans l'exemple ci-dessous, je vérifie l'existence du sous-dossier de / var / run où je mets les PID en tant qu'utilisateur courant, dans ce cas, l'utilisateur 'pi' (puisque je suis sur une framboise).
Vérifiez aussi ce lien , car il a été très instructif pour moi: script Python pour fonctionner comme service , il n'a toutefois pas le problème couverture discuté ici.
Exemple de partie de mon 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 $?
}