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


176

Tengo pocos trabajos crontab que se ejecutan bajo root, pero eso me da algunos problemas. Por ejemplo, todas las carpetas creadas en el proceso de ese trabajo cron están bajo la raíz del usuario y la raíz del grupo. ¿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

Respuestas:


335

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 -eeditará el crontab para el usuario de www-data. Simplemente coloque su comando completo allí y elimínelo del crontab del usuario raíz.


54
Funciona de la misma manera cuando lo usa crontab -ecomo un usuario específico.
kulak

77
Pero, ¿se comprobará este crontab al inicio del sistema o solo cuando el usuario inicie sesión?
Bruno Finger

11
cronon * nix systems no requiere que un usuario inicie sesión para ejecutar los trabajos especificados en el crontab de un usuario específico.
Mike

2
¿Esto también establecerá la identificación del grupo como lo solicitó el OP? ¿Qué pasa si el grupo que uno quiere es diferente del grupo primario del usuario?
askyle

49

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

Eso lo haría funcionar como un usuario de Apache que es www-data ¿verdad?
arma

19
Tenga en cuenta que este método no funcionará crontab -e, pero solo funciona si edita /etc/crontabdirectamente. Lea el comentario en la parte superior de este archivo para obtener más información.
imgx64

55
El usuario solo se puede especificar en el crontab del sistema
James Roth

Tengo algunos trabajos programados en el crontab del sistema. Cuando lo hago sudo crontab -e, veo los trabajos. Pero abro el archivo /etc/crontabno hay trabajos. ¿Esto es raro? Además, si sudo crontab -eagrego un trabajo con el usuario especificado, ¿funcionará?
eNeMetcH

14

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

Como usuario root (o usando sudo), simplemente puede 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 establecerse para que el www-datausuario tenga acceso a ellos.


Pensé que esto debería ser equivalente a crontab -esin embargo; pero no.
2014

55
Los documentos de Ubuntu han recomendado no editar / etc / crontab ya que las actualizaciones pueden sobrescribirlo. crontab -e creará un archivo cron específico del usuario en / var / spool / cron / crontabs.
Hemm

9

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"

Ver también: man runuser


runuserno está incluido en Ubuntu.
Raptor

1
runuser está en la última versión de Ubuntu. También hay alternativas a runuser como se describe en esta respuesta unix.stackexchange.com/questions/169441/ubuntu-runuser-command , por ejemplo, su y sudo.
Russell E Glaue

8

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

Recibía el siguiente error para el cron de VNC:

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

En mi caso, pude usar sudopara especificar a quién ejecutar la tarea.

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

1
Recibí este mensaje en los registros:sudo: sorry, you must have a tty to run sudo
Renato Gama

@renatoargh Probablemente estés corriendo en RedHat. Echa un vistazo a esta respuesta en Unix.SE.
Kaiser
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.