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