Tại sao tôi nhận được một lỗi không thể tạo tệp pid Lỗi Cấp phép bị từ chối lỗi?


11

Nếu một chương trình yêu cầu quyền viết, tôi nên cài đặt nó bằng chown như thế nào? Cụ thể, các quyền của chương trình sẽ là gì để giải quyết lỗi này?

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

Câu trả lời:


7

Nếu bạn có một chương trình foođang cố gắng tạo / ghi vào một tệp, các quyền của foonhị phân không thành vấn đề, nhưng người dùng nó đang chạy sẽ tạo ra sự khác biệt.

Trong trường hợp này, foođang cố gắng viết thư /var/run, được sở hữu bởi rootchỉ có thể ghi bằng root .

Vì vậy, bạn sẽ phải chạy chương trình như sudo foođể tạo tập tin PID đó. Vui lòng xem xét ý nghĩa bảo mật của việc cho phép chương trình chạy bằng root trước khi bạn thực hiện ...


nếu sự cho phép trên các nhị phân là một cái gì đó: rw-rr thì chương trình có thể được thực thi hay không nếu tôi đang chạy chương trình dưới dạng root tức là cho phép tạo id quy trình trong / var / run?
Ankit

@Ankit: nếu nhị phân không có quyền thực thi thì nó sẽ không "chạy"; nhưng bất cứ điều gì bạn không chạy như là người chủ sẽ có thể tạo ra một dưới pid/var/run
ish

Hoặc, viết tệp pid ở nơi khác (nhiều ứng dụng cho phép bạn chỉ định đường dẫn đến tệp pid).
msanford

1

Cách tiếp cận chung: xác định người dùng và nhóm của quá trình cố gắng truy cập tệp. Điều này thường được tìm thấy trong cấu hình của phần mềm (chẳng hạn như máy chủ web / mailservers / ...), nhưng nếu phần mềm đã chạy thì hãy sử dụng:

ps aux 

Tìm quá trình bạn muốn cấu hình quyền truy cập. Cột đầu tiên cho bạn biết tên người dùng đang chạy.

groups <username>

Điều này sẽ cho bạn biết những nhóm người dùng thuộc về.

Thay đổi chủ sở hữu hoặc nhóm của tệp để phù hợp với dịch vụ.

Lưu ý 1: Vì câu hỏi chỉ ra rằng tệp nằm trong / var / run / Tôi giả sử chỉ có một quy trình cần truy cập, nếu điều này không đúng, bạn không nên thay đổi chủ sở hữu hoặc nhóm, nhưng bạn có thể xem xét thêm quy trình 'người dùng vào nhóm hoặc tạo một nhóm mới cho tệp / thư mục này.

Lưu ý 2: Những điều thú vị có thể xảy ra với apparmor, đó là một hệ thống bảo mật: nó có thể ngăn các quá trình ghi vào các tệp và thư mục mà chúng có (ở cấp độ hệ thống tệp) tất cả các quyền cần thiết. Với aa-statusbạn có thể xem liệu một quy tắc cụ thể cho dịch vụ của bạn đang hoạt động.


1

Những gì tôi đã làm chỉ đơn giản là thêm việc tạo một thư mục ngay trước khi start-stop-deamon được thực thi. Điều này hoạt động vì tập lệnh thường được thực thi như root trong khi khởi động. Nó chỉ tạo thư mục trong / var / run và thay đổi chủ sở hữu ngay lập tức, do đó, có thể viết một PID.

Trong ví dụ dưới đây, tôi kiểm tra sự tồn tại của thư mục con của / var / run trong đó tôi đặt các PID làm người dùng chạy hiện tại, trong trường hợp này là người dùng 'pi' (vì tôi đang dùng mâm xôi).

Ngoài ra, hãy kiểm tra liên kết này vì nó rất giáo dục đối với tôi: Tập lệnh Python để chạy dưới dạng dịch vụ , tuy nhiên, nó không đề cập đến vấn đề được thảo luận ở đây.

Phần ví dụ của tập lệnh shell của tôi:

# 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 $?
}

Có một phiên bản này cho systemd?
Artem Russakovskii
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.