Pourquoi est-ce que j'obtiens une erreur «échec de création du fichier pid… Autorisation refusée»?

11

Si un programme nécessite une autorisation d'écriture, comment dois-je le définir avec chown? Plus précisément, quelles seraient les autorisations de foo pour résoudre cette erreur?

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

Réponses:

7

Si un programme fooessaie de créer / écrire dans un fichier, les autorisations du foobinaire n'ont pas d'importance, mais l'utilisateur qu'il exécute fait toute la différence.

Dans ce cas, fooessaie d'écrire sur /var/run, qui appartient à rootet n'est accessible en écriture que par root .

Il vous faudrait donc exécuter le programme sudo foopour 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 ...

ish
la source
si l'autorisation sur les binaires est quelque chose: rw-rr alors le programme serait-il exécutable étant donné que j'exécute le programme en tant que root c'est-à-dire permettant de créer un identifiant de processus sous / var / run?
Ankit
@Ankit: si un binaire n'a aucune autorisation exécutable, il ne "s'exécutera" pas; mais tout ce que vous exécutez en tant que root pourra créer un pid sous/var/run
ish
Vous pouvez également écrire le fichier pid ailleurs ( de nombreuses applications vous permettent de spécifier le chemin du fichier pid).
msanford
1

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-statusvous pouvez voir si une règle spécifique pour votre service est actif.

Neduz
la source
1

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 $?
}
user2842868
la source
Vous en avez une version pour systemd?
Artem Russakovskii du