Warum erhalte ich den Fehler "PID-Datei konnte nicht erstellt werden ... Berechtigung verweigert"?

11

Wenn ein Programm eine Schreibberechtigung benötigt, wie soll ich es mit chown einstellen? Welche Berechtigungen hätte das Programm foo, um diesen Fehler zu beheben?

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

Antworten:

7

Wenn Sie ein Programm haben, das fooversucht, eine Datei zu erstellen / in diese zu schreiben, spielen die Berechtigungen der fooBinärdatei keine Rolle, aber der Benutzer, den sie ausführt, macht den Unterschied.

In diesem Fall foowird versucht, zu schreiben /var/run, das Eigentum von root ist rootund nur von root geschrieben werden kann .

Sie müssten also das Programm ausführen sudo foo, um diese PID-Datei zu erstellen. Bitte beachten Sie die Auswirkungen auf die Sicherheit, wenn Sie zulassen, dass ein Programm als Root ausgeführt wird, bevor Sie dies tun ...

ish
quelle
Wenn die Berechtigung für die Binärdateien etwas ist: rw-rr, wäre das Programm dann ausführbar, da ich das Programm als root ausführe, dh eine Prozess-ID unter / var / run erstellen kann?
Ankit
@Ankit: Wenn eine Binärdatei überhaupt keine ausführbaren Berechtigungen hat, wird sie nicht "ausgeführt". aber alles , was Sie als root ausführen können eine pid unter erstellen kann/var/run
ish
Alternativ können Sie die PID-Datei an eine andere Stelle schreiben (in vielen Anwendungen können Sie den Pfad zur PID-Datei angeben).
Msanford
1

Allgemeiner Ansatz: Bestimmen Sie den Benutzer und die Gruppe des Prozesses, der versucht, auf die Datei zuzugreifen. Dies ist häufig in der Konfiguration der Software zu finden (z. B. Webserver / Mailserver / ...). Wenn die Software jedoch bereits ausgeführt wird, verwenden Sie Folgendes:

ps aux 

Suchen Sie nach dem Prozess, für den Sie Zugriffsrechte konfigurieren möchten. In der ersten Spalte erfahren Sie, unter welchem ​​Benutzernamen es ausgeführt wird.

groups <username>

Hier erfahren Sie, zu welchen Gruppen der Benutzer gehört.

Ändern Sie den Eigentümer oder die Gruppe der Datei entsprechend dem Dienst.

Hinweis 1: Da die Frage darauf hinweist, dass sich die Datei in / var / run / befindet, gehe ich davon aus, dass nur ein Prozess Zugriff benötigt. Wenn dies nicht der Fall ist, sollten Sie den Eigentümer oder die Gruppe nicht ändern, aber Sie könnten in Betracht ziehen, den Prozess hinzuzufügen 'Benutzer der Gruppe oder Erstellen einer neuen Gruppe für diese Datei / diesen Ordner.

Hinweis 2: Mit Apparmor, einem Sicherheitssystem, können lustige Dinge passieren: Es kann verhindern, dass Prozesse in Dateien und Ordner schreiben, für die sie (auf Dateisystemebene) alle erforderlichen Rechte haben. Mit können aa-statusSie sehen, ob eine bestimmte Regel für Ihren Dienst aktiv ist.

Neduz
quelle
1

Ich habe einfach die Erstellung eines Ordners hinzugefügt, kurz bevor der Start-Stopp-Deamon ausgeführt wird. Dies funktioniert, da das Skript beim Start im Allgemeinen als Root ausgeführt wird. Es wird lediglich der Ordner in / var / run erstellt und der Eigentümer sofort geändert, sodass eine PID geschrieben werden kann.

Im folgenden Beispiel überprüfe ich, ob der Unterordner von / var / run vorhanden ist, in dem ich die PIDs als aktuellen Ausführungsbenutzer angegeben habe, in diesem Fall Benutzer 'pi' (da ich auf einer Himbeere bin).

Überprüfen Sie auch diesen Link, da er für mich sehr lehrreich war: Python-Skript zur Ausführung als Dienst , das hier behandelte Problem wurde jedoch nicht behandelt.

Beispielteil meines Shell-Skripts:

# 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
quelle
Hast du eine Version davon für systemd?
Artem Russakovskii