Yanıtlar:
foo
Bir dosya oluşturmaya / dosyaya yazmaya çalışan bir programınız varsa , foo
ikili 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 foo
yazmaya çalışıyor ./var/run
root
Yani sudo foo
bu 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 ...
/var/run
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-status
hizmetiniz için belirli bir kuralın etkin olup olmadığını görebilirsiniz.
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 $?
}