Antworten:
Wenn Sie ein Programm haben, das foo
versucht, eine Datei zu erstellen / in diese zu schreiben, spielen die Berechtigungen der foo
Binärdatei keine Rolle, aber der Benutzer, den sie ausführt, macht den Unterschied.
In diesem Fall foo
wird versucht, zu schreiben /var/run
, das Eigentum von root ist root
und 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 ...
/var/run
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-status
Sie sehen, ob eine bestimmte Regel für Ihren Dienst aktiv ist.
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 $?
}