Upstart `Unicorn` con Umask ignorato
-
28-10-2019 - |
Domanda
sto usando upstart v1.4
Per avviare il mio server delle applicazioni, si chiama unicorn
.
Il upstart
Il file di configurazione sembra questo:
description "Unicorn Application Server"
start on network
stop on runlevel [!2345]
umask 0003
setuid unicorn
setgid myproject
chdir /opt/myproject/
respawn
exec /opt/myproject/bin/unicorn --config-file /opt/myproject/config/unicorn.rb --env production
È essenziale che il processo sia eseguito 0774
, questo è ug+rwxo+r
, almeno per le directory. Utente e gruppo sono condivisi come come il server Nginx, i caricamenti, l'accesso del personale, ecc.
Ho osservato che le directory sono create con le autorizzazioni errate:
drw-rw-r-- 2 unicorn myproject 4096 2012-01-13 06:58 20120113-0658-7704-4676
Per quanto ne so, nulla nella mia applicazione lo sta causando.
Secondo l'attacco gdb
al processo e alla chiamata call umask(0)
, l'efficace Umask è 75
, o 0o113
.
Ecco il gdb
sessione:
root@1:/opt/myproject# cat ./tmp/pids/unicorn.pid
7600
root@1:/opt/myproject# gdb
GNU gdb (GDB) 7.1-ubuntu
(gdb) attach 7600
Attaching to process 7600
(gdb) call umask(0)
$1 = 75
(gdb) call umask(75)
$2 = 0
(gdb) q
Quit anyway? (y or n) y
Detaching from program: /usr/local/bin/ruby, process 7600
root@1:/opt/myproject# ruby -e 'printf("%o\n", 75)'
113
La Umask di 113
spiegherebbe le autorizzazioni. 664
, che sembra essere quello che sto vedendo.
Cosa sto facendo di sbagliato qui, è un comportamento maltrattamento unicorno? Upstart sta ignorando la mia strofa? Dovrei definire la strofa come 003
, non 0003
? È il mio gdb
lavoro di sessione e %o
printf()
sintassi corretta?
Soluzione
In che modo "unicorno" si comporta al di fuori di un ambiente di partenza? Immagino esattamente lo stesso, ma per favore controlla questo (mantieni tutto il più semplice possibile).
Ricorda che un valore di Umask non è un assoluto: come suggerisce il nome, è una maschera: "sottrae" i bit di autorizzazione Dai bit di autorizzazione l'applicazione specifica quando apre un file o crea una directory. Upsarts Umask Strofe si sta comportando da ciò che posso vedere, quindi il tuo problema deve essere con questa applicazione unicorna che specifica ciò che è per te uno strano set di bit di autorizzazione (modalità) quando apre i file per la scrittura e crea directory.
Prova a Stracing Unicorn per vedere cosa sta effettivamente facendo:
strace -o /tmp/strace.log -fFv -s 1024 /opt/myproject/bin/unicorn --config-file ...
Avendo aspettato che gli unicorni creino alcuni file e/o directory, fermarlo/uccidere e guardare il file /tmp/strace.log.
Grep per "Open (File)" in cui il file è il nome di uno dei file che crea ad esempio e vedere quale è il terzo argomento per la chiamata di sistema aperto. Quando hai quel valore di modalità, dovrebbe essere possibile costruire un valore Umask per fornire le autorizzazioni del file desiderate. Si noti che ciò presuppone che unicorno:
- è coerente con la modalità che specifica.
- non chiama Umask (2) si (che sovrascriverebbe la strofa Umask upstart).
- non chiama chmod (2)/fchmod (2).
Se - dopo aver seguito il processo sopra - pensi ancora che ci sia un problema con UPSTART, si prega di fornire un semplice caso di test (che non richiede unicorno) e solleva un bug qui: https://bugs.launchpad.net/upstart/+filebug.
Altri suggerimenti
Se invece di chiamare unicorno dalla strofa del dirigente chiama uno script che chiama semplicemente "Umask >> /TMP /Somefile" Cosa ci mette? Se ciò dà la risposta prevista, il tuo problema è nell'unicorno.