¿Cómo especificar en crontab por qué usuario ejecutar script?


Tengo pocos trabajos de crontab que se ejecutan en root, pero eso me da algunos problemas. Por ejemplo, todas las carpetas creadas en el proceso de ese trabajo cron están en usuario root y grupo root. ¿Cómo puedo hacer que se ejecute bajo el usuario www-data y el grupo www-data para que cuando ejecute scripts desde mi sitio web pueda manipular esas carpetas y archivos?

Mi servidor se ejecuta en Ubuntu.
El trabajo actual de crontab es:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
Author: the Tin Man, 2011-12-12

5 answers

En lugar de crear un crontab para que se ejecute como usuario root, cree un crontab para el usuario que desea ejecutar el script. En su caso, crontab -u www-data -e editará el crontab para el usuario www-data. Simplemente ponga su comando completo allí y elimínelo del crontab del usuario root.

 271
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-12 15:53:18

EDITAR: Tenga en cuenta que este método no funcionará con crontab-e, pero solo funciona si edita /etc/crontab directamente. De lo contrario, puede obtener un error como /bin/sh: www-data: command not found

Justo antes del nombre del programa:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
 40
Author: Christian Nowak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-08 22:55:23

Dado que está ejecutando Ubuntu, su crontab del sistema se encuentra en /etc/crontab.

Como usuario root (o usando sudo), puede simplemente editar este archivo y especificar el usuario que debe ejecutar este comando. Aquí está el formato de las entradas en el crontab del sistema y cómo debe ingresar su 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

Por supuesto, los permisos para su script php y su archivo de registro deben configurarse para que el usuario www-data tenga acceso a ellos.

 12
Author: pymkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 08:18:35

La sugerencia de Mike suena como la "manera correcta". Me encontré con este hilo que quería especificar el usuario para ejecutar vncserver en el reinicio y quería mantener todos mis trabajos cron en un solo lugar.

Estaba recibiendo el siguiente error para el cron VNC:

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

En mi caso, pude usar sudo para especificar cómo ejecutar la tarea.

@reboot sudo -u [someone] vncserver ...
 7
Author: Oliver Moran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-12 12:49:04

También puede intentar usar runuser (como root) para ejecutar un comando como un usuario diferente

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

Véase también: man runuser

 7
Author: Russell E Glaue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-20 16:13:13