Почему я получаю сообщение об ошибке «не удалось создать файл pid… Permission Denied»?

11

Если программе требуется разрешение на запись, как мне установить ее с помощью chown? В частности, какими должны быть разрешения программы foo для решения этой ошибки?

failed to create pid file '/var/run/bar.pid': Permission denied
el_pup_le
источник

Ответы:

7

Если у вас есть программа, fooпытающаяся создать / записать файл, права доступа к fooдвоичному файлу не имеют значения, но все, что от них требуется , - пользователь, с которым он работает .

В этом случае fooпытается выполнить запись в систему /var/run, которая принадлежит rootи доступна для записи только пользователю root .

Таким образом, вам нужно будет запустить программу, sudo fooчтобы создать этот файл PID. Пожалуйста, примите во внимание последствия безопасности для запуска программы от имени пользователя root до того, как вы это сделаете ...

иш
источник
если разрешение для двоичных файлов является чем-то вроде: rw-rr, тогда будет ли программа исполняемой, если я запускаю программу от имени пользователя root, то есть позволяю создать идентификатор процесса в / var / run?
Ankit
@Ankit: если бинарный файл вообще не имеет разрешений на выполнение, он не будет «работать»; но все , что вы столкнетесь как корень будет в состоянии создать Pid Under/var/run
иш
Также можно написать файл pid в другом месте (многие приложения позволяют указать путь к файлу pid).
Мсэнфорд
1

Общий подход: определить пользователя и группу процесса, пытающегося получить доступ к файлу. Это часто встречается в конфигурации программного обеспечения (такого как веб-серверы / почтовые серверы / ...), но если программное обеспечение уже работает, используйте это:

ps aux 

Найдите процесс, для которого вы хотите настроить права доступа. В первом столбце указывается, под каким именем пользователя он работает.

groups <username>

Это скажет вам, к каким группам принадлежит пользователь.

Измените владельца или группу файла в соответствии со службой.

Примечание 1: Поскольку вопрос указывает на то, что файл находится в / var / run /, я предполагаю, что доступ нужен только одному процессу, если это не так, вам не следует менять владельца или группу, но вы можете рассмотреть возможность добавления процесса 'пользователь в группе или создание новой группы для этого файла / папки.

Примечание 2: забавные вещи могут случиться с apparmor, который является системой безопасности: он может препятствовать записи процессов в файлы и папки, на которые они имеют (на уровне файловой системы) все необходимые права. С aa-statusего помощью вы можете увидеть, является ли конкретное правило для вашего сервиса активным.

Neduz
источник
1

Я просто добавил создание папки непосредственно перед выполнением start-stop-deamon. Это работает, потому что сценарий обычно запускается от имени пользователя root при запуске. Он просто создает папку в / var / run и немедленно меняет владельца, поэтому можно записать PID.

В приведенном ниже примере я проверяю наличие подпапки / var / run, где я помещаю PID в качестве текущего пользователя run, в данном случае user 'pi' (так как я на малине).

Также проверьте эту ссылку, так как она была очень познавательна для меня: скрипт Python для запуска в качестве службы , однако он не охватывал проблему, обсуждаемую здесь.

Пример части моего сценария оболочки:

# 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
источник
Есть версия этого для systemd?
Артем Руссаковский