¿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
arma
fuente

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.

Miguel
fuente
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
Christian Nowak
fuente
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.

pymkin
fuente
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

Russell E Glaue
fuente
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 ...
Oliver Moran
fuente
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