Jawaban:
Jika Anda memiliki program yang foo
mencoba membuat / menulis ke file, izin foo
biner tidak masalah, tetapi pengguna yang menjalankannya membuat perbedaan.
Dalam hal ini, foo
sedang mencoba untuk menulis /var/run
, yang dimiliki oleh root
dan hanya dapat ditulis oleh root .
Jadi, Anda harus menjalankan program sudo foo
untuk membuat file PID itu. Silakan pertimbangkan implikasi keamanan dari mengizinkan suatu program berjalan sebagai root sebelum Anda melakukannya ...
/var/run
Pendekatan umum: tentukan pengguna dan grup proses yang mencoba mengakses file. Ini sering ditemukan dalam konfigurasi perangkat lunak (seperti webservers / mailservers / ...), tetapi jika perangkat lunak sudah berjalan gunakan ini:
ps aux
Cari proses yang ingin Anda konfigurasi hak aksesnya. Kolom pertama memberi tahu Anda nama pengguna yang menjalankannya.
groups <username>
Ini akan memberi tahu Anda ke grup mana pengguna berada.
Ubah pemilik atau grup file untuk mencocokkan layanan.
Catatan 1: Saat pertanyaan menunjukkan bahwa file tersebut berada di / var / run / Saya berasumsi hanya satu proses yang membutuhkan akses, jika ini tidak benar, Anda tidak boleh mengubah pemilik atau grup, tetapi Anda dapat mempertimbangkan untuk menambahkan proses 'pengguna ke grup atau membuat grup baru untuk file / folder ini.
Catatan 2: Hal-hal lucu dapat terjadi dengan apparmor, yang merupakan sistem keamanan: hal itu dapat mencegah proses penulisan ke file dan folder yang mereka miliki (pada tingkat sistem file) semua hak yang diperlukan. Dengan aa-status
Anda dapat melihat apakah aturan khusus untuk layanan Anda aktif.
Yang saya lakukan hanyalah menambahkan pembuatan folder tepat sebelum start-stop-deamon dijalankan. Ini berfungsi karena skrip umumnya dijalankan sebagai root selama start up. Itu hanya membuat folder di / var / run dan mengubah pemiliknya segera, sehingga PID dapat ditulis.
Dalam contoh di bawah ini, saya memeriksa keberadaan subfolder dari / var / run di mana saya meletakkan PID sebagai pengguna run saat ini, dalam hal ini pengguna 'pi' (karena saya menggunakan raspberry).
Periksa juga tautan ini karena ini sangat mendidik bagi saya: Skrip Python dijalankan sebagai layanan , namun, itu tidak mencakup masalah yang dibahas di sini.
Bagian contoh skrip shell saya:
# 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 $?
}