Если программе требуется разрешение на запись, как мне установить ее с помощью chown? В частности, что бы запрограммировать разрешения foo для решения этой ошибки?
failed to create pid file '/var/run/bar.pid': Permission denied
Если у вас есть программа foo
, пытающаяся создать / записать файл, права доступа к двоичному файлу foo
не имеют значения, но пользователь , работающий как , имеет все значение.
В этом случае foo
пытается записать в /var/run
, который принадлежит root
и только , доступный для записи в root .
Таким образом, вам нужно будет запустить программу как sudo foo
, чтобы она создала этот файл PID. Пожалуйста, примите во внимание последствия безопасности, которые могут возникнуть, если программа будет запускаться от имени пользователя root до того, как вы это сделаете ...
Общий подход: определить пользователя и группу процесса, пытающегося получить доступ к файлу. Это часто встречается в конфигурации программного обеспечения (например, веб-серверы / почтовые серверы / ...), но если программное обеспечение уже работает, используйте это:
ps aux
Найдите процесс, для которого вы хотите настроить доступ права на. В первом столбце указывается, под каким именем пользователя он работает.
groups <username>
Это скажет вам, к каким группам принадлежит пользователь.
Измените владельца или группу файла в соответствии со службой.
Примечание 1. Поскольку вопрос указывает на то, что файл находится в / var / run /, я предполагаю, что доступ нужен только одному процессу, если это не так, вам не следует менять владельца или группу, но вы можете подумать добавление пользователя процесса в группу или создание новой группы для этого файла / папки.
Примечание 2. С apparmor, который представляет собой систему безопасности, могут происходить забавные вещи: она может препятствовать записи процессов в файлы и папки, на которые они имеют (на уровне файловой системы) все необходимые права. С помощью aa-status
вы можете увидеть, является ли конкретное правило для вашей службы активным.
То, что я сделал, просто добавляют создание папки непосредственно перед тем, как 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 $?
}