web-dev-qa-db-fra.com

Comment spécifier dans crontab par quel utilisateur exécuter le script?

Quelques travaux crontab sont exécutés sous root, mais cela me pose quelques problèmes. Par exemple, tous les dossiers créés dans le processus de ce travail cron se trouvent sous l'utilisateur root et le groupe root. Comment puis-je le faire fonctionner sous l'utilisateur www-data et le groupe www-data afin que, lorsque j'exécute les scripts de mon site Web, je puisse manipuler ces dossiers et fichiers?

Mon serveur fonctionne sur Ubuntu.
Le travail actuel de crontab est:

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

Au lieu de créer une crontab à exécuter en tant qu'utilisateur root, créez une crontab pour l'utilisateur sur lequel vous souhaitez exécuter le script. Dans votre cas, crontab -u www-data -e éditera la crontab de l'utilisateur www-data. Il suffit de mettre votre commande complète et de la supprimer de la crontab de l'utilisateur root.

311
Mike

EDIT: notez que cette méthode ne fonctionnera pas avec crontab -e, mais seulement si vous éditez directement/etc/crontab. Sinon, vous risquez d'obtenir une erreur telle que /bin/sh: www-data: command not found

Juste avant le nom du programme:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1
44
Christian Nowak

Puisque vous utilisez Ubuntu, votre crontab système est situé à /etc/crontab.

En tant qu'utilisateur root (ou utilisant Sudo), vous pouvez simplement éditer ce fichier et spécifier l'utilisateur qui doit exécuter cette commande. Voici le format des entrées dans la crontab du système et comment entrer votre commande:

# 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

Bien entendu, les autorisations pour votre script php et votre fichier journal doivent être définies de manière à ce que l'utilisateur www-data puisse y accéder.

14
pymkin

Vous pouvez également essayer d'utiliser runuser (en tant que root) pour exécuter une commande en tant qu'utilisateur différent.

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

Voir aussi: man runuser

9
Russell E Glaue

La suggestion de Mike ressemble à la "bonne façon". Je suis tombé sur ce fil en voulant spécifier que l'utilisateur devait exécuter vncserver sous le redémarrage et je voulais garder toutes mes tâches cron au même endroit.

Je recevais l'erreur suivante pour le cron VNC:

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

Dans mon cas, j'ai pu utiliser Sudo pour spécifier qui exécuter la tâche.

@reboot Sudo -u [someone] vncserver ...
8
Oliver Moran