Odpowiedzi:
Jeśli masz program, który foo
próbuje utworzyć / zapisać do pliku, uprawnienia pliku foo
binarnego nie mają znaczenia, ale użytkownik , który działa, robi różnicę.
W tym przypadku foo
próbuje napisać do /var/run
, który jest własnością root
i zapisywalny tylko przez root .
Musisz więc uruchomić program sudo foo
, aby utworzyć ten plik PID. Zanim to zrobisz, weź pod uwagę wpływ na bezpieczeństwo zezwalania na uruchamianie programu jako root.
/var/run
Podejście ogólne: określ użytkownika i grupę procesu próbującego uzyskać dostęp do pliku. Często można to znaleźć w konfiguracji oprogramowania (takiego jak serwery WWW / serwery poczty / ...), ale jeśli oprogramowanie już działa, użyj tego:
ps aux
Wyszukaj proces, dla którego chcesz skonfigurować prawa dostępu. Pierwsza kolumna informuje, pod jaką nazwą użytkownika działa.
groups <username>
Dzięki temu dowiesz się, do których grup należy użytkownik.
Zmień właściciela lub grupę pliku, aby pasowała do usługi.
Uwaga 1: Ponieważ pytanie wskazuje, że plik znajduje się w / var / run / Zakładam, że tylko jeden proces potrzebuje dostępu, jeśli nie jest to prawdą, nie powinieneś zmieniać właściciela ani grupy, ale możesz rozważyć dodanie procesu „użytkownik do grupy lub tworzenie nowej grupy dla tego pliku / folderu.
Uwaga 2: Zabawne rzeczy mogą się zdarzyć z apparmor, który jest systemem bezpieczeństwa: może uniemożliwić procesom zapisywanie do plików i folderów, do których mają (na poziomie systemu plików) wszystkie niezbędne prawa. Dzięki aa-status
możesz sprawdzić, czy konkretna reguła dla Twojej usługi jest aktywna.
Po prostu dodałem utworzenie folderu tuż przed uruchomieniem start-stop-deamon. Działa to, ponieważ skrypt jest generalnie uruchamiany jako root podczas uruchamiania. Po prostu tworzy folder w / var / run i natychmiast zmienia właściciela, aby można było zapisać PID.
W poniższym przykładzie sprawdzam, czy istnieje podfolder / var / run, w którym umieszczam PID jako bieżący użytkownik uruchamiający, w tym przypadku użytkownik „pi” (ponieważ jestem na malinie).
Sprawdź również ten link, ponieważ był dla mnie bardzo edukacyjny: skrypt Pythona do działania jako usługa , jednak nie obejmował on omawianego tutaj problemu.
Przykładowa część mojego skryptu powłoki:
# 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 $?
}