Câu trả lời:
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 foo
nhị 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 root
và chỉ 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 ...
/var/run
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-status
bạ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.
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 $?
}