Чому я отримую помилку "не вдалося створити pid-файл ... Відхилено дозвіл"?


11

Якщо програма вимагає дозволу на запис, як я повинен встановити її з chown? Що конкретно, що дозволить програмувати foo, щоб вирішити цю помилку?

failed to create pid file '/var/run/bar.pid': Permission denied

Відповіді:


7

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

У цьому випадку fooнамагається записати в те /var/run, що належить rootі працює тільки з коренем .

Тож вам доведеться запустити програму sudo fooдля створення цього файлу PID. Будь ласка, врахуйте наслідки для безпеки дозволу програмі запускатися як root перед тим, як це зробити ...


якщо дозвіл на двійкові файли є чимось: rw-rr, то чи буде програма виконана, враховуючи, що я запускаю програму як root, тобто дозволяю створити ідентифікатор процесу під / var / run?
Анкіт

@Ankit: якщо бінарний файл не має дозволу на виконання, він не працює "; але все , що ви зіткнетеся як корінь буде в змозі створити Pid Under/var/run
іш

Крім того, запишіть файл pid в іншому місці (багато програм дозволяють вказати шлях до pid-файлу).
msanford

1

Загальний підхід: визначте користувача та групу процесу, який намагається отримати доступ до файлу. Це часто зустрічається в конфігурації програмного забезпечення (наприклад, веб-серверів / поштових серверів / ...), але якщо програмне забезпечення вже запущене, використовуйте це:

ps aux 

Знайдіть процес, для якого потрібно налаштувати права доступу. Перший стовпець повідомляє про те, під яким іменем користувача він працює.

groups <username>

Це покаже вам, до яких груп належить користувач.

Змініть власника або групу файлу, щоб він відповідав службі.

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

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


1

Що я зробив, це просто додати створення папки перед виконанням запуску-стопу-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 $?
}

Отримали версію цього для systemd?
Артем Русаковський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.