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