Dlaczego pojawia się błąd „nie udało się utworzyć pliku pid… Odmowa zezwolenia”?

11

Jeśli program wymaga uprawnień do zapisu, jak mam to ustawić za pomocą chown? W szczególności, jakie byłyby uprawnienia programu foo do rozwiązania tego błędu?

failed to create pid file '/var/run/bar.pid': Permission denied
el_pup_le
źródło

Odpowiedzi:

7

Jeśli masz program, który foopróbuje utworzyć / zapisać do pliku, uprawnienia pliku foobinarnego nie mają znaczenia, ale użytkownik , który działa, robi różnicę.

W tym przypadku foopróbuje napisać do /var/run, który jest własnością rooti 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.

ish
źródło
jeśli pozwolenie na pliki binarne to coś: rw-rr, to czy program byłby wykonywalny, biorąc pod uwagę, że działam jako root, tzn. pozwalając na utworzenie identyfikatora procesu w katalogu / var / run?
Ankit,
@Ankit: jeśli plik binarny nie ma żadnych uprawnień do wykonywania, nie zostanie „uruchomiony”; ale cokolwiek robisz uruchomić jako root będzie mógł stworzyć pid Under/var/run
owski
Możesz też napisać plik pid w innym miejscu (wiele aplikacji pozwala określić ścieżkę do pliku pid).
msanford,
1

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-statusmożesz sprawdzić, czy konkretna reguła dla Twojej usługi jest aktywna.

Neduz
źródło
1

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 $?
}
użytkownik 2842868
źródło
Masz wersję tego dla systemd?
Artem Russakovskii