2011-12-12 4 views
129

Ho pochi processi di crontab eseguiti sotto root, ma questo mi dà alcuni problemi. Ad esempio, tutte le cartelle create nel processo di quel cron sono sotto root utente e radice di gruppo. Come posso farlo funzionare sotto utente www-data e gruppo www-data così quando eseguo script dal mio sito web posso manipolare quelle cartelle e file?Come specificare in crontab da quale utente eseguire lo script?

Il mio server gira su Ubuntu.
lavoro crontab corrente e:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1 

risposta

253

Invece di creare un crontab per l'esecuzione come utente root, creare un crontab per l'utente che si desidera eseguire il copione. Nel tuo caso, crontab -u www-data -e modificherà il crontab per l'utente www-data. Basta inserire il comando completo e rimuoverlo dal crontab dell'utente root.

+35

Funziona allo stesso modo quando si usa 'crontab -e' come utente specifico. – kulak

+0

doesnt lavoro per me mi potete aiutare :( – vishal

+5

Ma questo crontab essere controllato all'avvio del sistema o solo quando l'utente si collega? –

36

EDIT: Si noti che questo metodo non funziona con crontab -e, ma funziona solo se si modifica/etc/crontab direttamente. In caso contrario, è possibile ottenere un errore come /bin/sh: www-data: command not found

Poco prima il nome del programma:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1 
+0

che renderebbe eseguito strega utente come apache è giusto www-data ? – arma

+0

Grazie! Lo proverò subito. – arma

+13

Hmm tornare indietro '/ bin/sh: www-data: comando non trovato' – arma

7

Il suggerimento di Mike sembra il "modo giusto". Mi sono imbattuto in questo thread che voleva specificare l'utente per eseguire vncserver sotto il riavvio e voleva mantenere tutti i miei lavori cron in un unico posto.

stavo ottenendo il seguente errore per il cron VNC:

vncserver: The USER environment variable is not set. E.g.: 

Nel mio caso, ho potuto utilizzare sudo per specificare che per eseguire il compito.

@reboot sudo -u [someone] vncserver ... 
+1

ho ricevuto questo messaggio sui tronchi: 'sudo: scusa, devi avere un tty per eseguire sudo' – renatoargh

+0

@renatoargh Probabilmente stai correndo su RedHat. Dai un'occhiata a [questa risposta] (http://unix.stackexchange.com/questions/122616/why-do-i- bisogno-a-tty-to-run-sudo-se-i-can-sudo-senza-a-password) su Unix.SE. – kaiser

11

Dal momento che si sta eseguendo Ubuntu, il vostro crontab di sistema si trova a /etc/crontab.

Come utente root (o utilizzando sudo), è possibile modificare semplicemente questo file e specificare l'utente che deve eseguire questo comando. Ecco il formato delle voci nel crontab di sistema e come si dovrebbe inserire il comando:

# m h dom mon dow user command 
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1 

Naturalmente i permessi per lo script PHP e il file di log devono essere impostato in modo che l'utente www-data ha accesso ad essi.

+0

ho pensato che questo dovrebbe essere equivalente a 'crontab -e' anche se,. ma non – zinking

+5

I documenti di Ubuntu hanno raccomandato di non modificare/etc/c rontab in quanto può essere sovrascritto dagli aggiornamenti. crontab -e creerà un file cron specifico dell'utente in/var/spool/cron/crontabs. – Hemm

6

Si può anche provare a utilizzare runuser (come root) per eseguire un comando come un utente diverso

*/1 * * * * runuser php5 \ 
      --command="/var/www/web/includes/crontab/queue_process.php \ 
         >> /var/www/web/includes/crontab/queue.log 2>&1" 

Vedi anche: man runuser

+0

'runuser' non è incluso in Ubuntu. – Raptor

+1

runuser è nell'ultima versione di Ubuntu. Esistono anche alternative a runuser come discusso in questa risposta http://unix.stackexchange.com/questions/169441/ubuntu-runuser-command, ad es. su, e sudo. –