Neden “pid dosyası oluşturulamadı… İzin Reddedildi” hatası alıyorum?


11

Bir program yazma izni gerektiriyorsa, bunu chown ile nasıl ayarlamalıyım? Özellikle, programın bu hatayı çözmek için foo'nun izinleri ne olurdu?

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

Yanıtlar:


7

fooBir dosya oluşturmaya / dosyaya yazmaya çalışan bir programınız varsa , fooikili dosyanın izinleri önemli değildir, ancak çalıştırdığı kullanıcı tüm farkı yaratır.

Bu durumda, sahip olunan ve sadece kök tarafından yazılabilir olan fooyazmaya çalışıyor ./var/runroot

Yani sudo foobu PID dosyasını oluşturmak için programı olduğu gibi çalıştırmanız gerekir. Lütfen bir programın sizden önce root olarak çalışmasına izin vermenin güvenlik sonuçlarını göz önünde bulundurun ...


ikili izin izin bir şey ise: rw-rr sonra ben kök yani yani / var / run altında bir işlem kimliği oluşturmaya izin programı çalıştırıyorum verilen program yürütülebilir olur?
Ankit

@Ankit: Eğer bir ikili dosya çalıştırılabilir izinleri yoksa "çalışmaz"; ancak root olarak yaptığınız her şey altında bir pid oluşturabilir/var/run
ish

Alternatif olarak, pid dosyasını başka bir yere yazın (birçok uygulama pid dosyasının yolunu belirtmenize izin verir).
msanford

1

Genel yaklaşım: dosyaya erişmeye çalışan işlemin kullanıcı ve grubunu belirlemenizi sağlar. Bu genellikle yazılımın yapılandırmasında bulunur (web sunucuları / posta sunucuları / ... gibi), ancak yazılım zaten çalışıyorsa bunu kullanın:

ps aux 

Erişim haklarını yapılandırmak istediğiniz işlemi arayın. İlk sütun hangi kullanıcı adının altında çalıştığını gösterir.

groups <username>

Bu size kullanıcının hangi gruplara ait olduğunu söyleyecektir.

Dosyanın sahibini veya grubunu hizmetle eşleşecek şekilde değiştirin.

Not 1: Soru, dosyanın / var / run / içinde olduğunu belirttiğinden, yalnızca bir işlemin erişime ihtiyacı olduğunu varsayıyorum, bu doğru değilse, sahibi veya grubu değiştirmemelisiniz, ancak işlemi eklemeyi düşünebilirsiniz 'kullanıcı grubuna ekleyin veya bu dosya / klasör için yeni bir grup oluşturun.

Not 2: Bir güvenlik sistemi olan apparmor ile komik şeyler olabilir: süreçlerin gerekli tüm haklara sahip oldukları dosya ve klasörlere (dosya sistemi düzeyinde) yazmasını engelleyebilir. İle aa-statushizmetiniz için belirli bir kuralın etkin olup olmadığını görebilirsiniz.


1

Yaptığım şey start-stop-deamon yürütülmeden hemen önce bir klasör oluşturmak. Bu komut dosyası başlatma sırasında genellikle kök olarak yürütüldüğü için çalışır. Sadece / var / run içindeki klasörü oluşturur ve sahibini hemen değiştirir, böylece bir PID yazılabilir.

Aşağıdaki örnekte, / var / run alt klasörünün varlığını kontrol ediyorum, burada PID'leri geçerli çalışma kullanıcısı olarak koydum, bu durumda kullanıcı 'pi' (ahududu üzerinde olduğum için).

Ayrıca benim için çok eğitici olduğu için bu bağlantıyı kontrol edin: Python betiği hizmet olarak çalışmak , ancak burada tartışılan sorunu kapsamıyordu.

Kabuk betiğimin örnek kısmı:

# 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 için bunun bir sürümü var mı?
Artem Russakovskii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.