Mengapa saya mendapatkan kesalahan "gagal membuat file pid ... Izin Ditolak"?

11

Jika suatu program memerlukan izin tulis, bagaimana cara mengaturnya dengan chown? Secara khusus, apa yang akan memprogram izin foo untuk mengatasi kesalahan ini?

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

Jawaban:

7

Jika Anda memiliki program yang foomencoba membuat / menulis ke file, izin foobiner tidak masalah, tetapi pengguna yang menjalankannya membuat perbedaan.

Dalam hal ini, foosedang mencoba untuk menulis /var/run, yang dimiliki oleh rootdan hanya dapat ditulis oleh root .

Jadi, Anda harus menjalankan program sudo foountuk membuat file PID itu. Silakan pertimbangkan implikasi keamanan dari mengizinkan suatu program berjalan sebagai root sebelum Anda melakukannya ...

ish
sumber
jika izin pada binari adalah sesuatu: rw-rr maka program akan dieksekusi mengingat bahwa saya menjalankan program sebagai root yaitu memungkinkan untuk membuat proses id di bawah / var / run?
Ankit
@Ankit: jika biner sama sekali tidak memiliki izin yang dapat dieksekusi, ia tidak akan "berjalan"; tetapi apa pun yang Anda jalankan sebagai root akan dapat membuat pid di bawah/var/run
ish
Atau, tulis file pid di tempat lain (banyak aplikasi memungkinkan Anda menentukan path ke file pid).
msanford
1

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-statusAnda dapat melihat apakah aturan khusus untuk layanan Anda aktif.

Neduz
sumber
1

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 $?
}
pengguna2842868
sumber
Punya versi ini untuk systemd?
Artem Russakovskii