Почему я получаю & ldquo; не удалось создать pid-файл & hellip; Permission Denied & rdquo; ошибка?

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

failed to create pid file '/var/run/bar.pid': Permission denied
11
задан 10 August 2012 в 13:16

3 ответа

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

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

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

0
ответ дан 10 August 2012 в 13:16

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

ps aux 

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

groups <username>

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

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

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

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

0
ответ дан 10 August 2012 в 13:16

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

В примере ниже, я проверяю на существование подпапки/var/run, куда я поместил PIDs как текущий пользователь выполнения в этом пользователе случая 'пи' (так как я нахожусь на малине).

Также проверьте эту ссылку, так как это было очень образовательным мне: сценарий 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 $?
}
1
ответ дан 10 August 2012 в 13:16

Другие вопросы по тегам:

Похожие вопросы: