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

176

J'ai peu de travaux crontab qui fonctionnent sous root, mais cela me pose quelques problèmes. Par exemple, tous les dossiers créés au cours de cette tâche cron sont sous la racine de l'utilisateur et la racine du groupe. Comment puis-je le faire fonctionner sous l'utilisateur www-data et le groupe www-data afin que lorsque j'exécute des scripts à partir de mon site Web, je puisse manipuler ces dossiers et fichiers?

Mon serveur fonctionne sur Ubuntu.
La tâche crontab actuelle est:

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

Réponses:

335

Au lieu de créer un crontab à exécuter en tant qu'utilisateur root, créez un crontab pour l'utilisateur pour lequel vous souhaitez exécuter le script. Dans votre cas, crontab -u www-data -eéditera le crontab pour l'utilisateur www-data. Mettez simplement votre commande complète là-dedans et supprimez-la de la crontab de l'utilisateur root.

Mike
la source
54
Cela fonctionne de la même manière lorsque vous utilisez en crontab -etant qu'utilisateur spécifique.
kulak
7
Mais cette crontab sera-t-elle vérifiée au démarrage du système ou seulement lorsque l'utilisateur se connectera?
Bruno Finger
11
cronsur les systèmes * nix, il n'est pas nécessaire qu'un utilisateur se connecte pour exécuter les travaux spécifiés dans la crontab d'un utilisateur spécifique.
Mike
2
Cela définira-t-il également l'identifiant du groupe comme le PO l'a demandé? Que faire si le groupe souhaité est différent du groupe principal de l'utilisateur?
askyle
49

EDIT: Notez que cette méthode ne fonctionnera pas avec crontab -e, mais ne fonctionnera que si vous éditez / etc / crontab directement. Sinon, vous pouvez obtenir une erreur comme/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
Christian Nowak
la source
Cela le ferait fonctionner en tant qu'utilisateur apache, qui est www-data, n'est-ce pas?
arma
19
Notez que cette méthode ne fonctionnera pas avec crontab -e, mais ne fonctionnera que si vous modifiez /etc/crontabdirectement. Lisez le commentaire en haut de ce fichier pour plus d'informations.
imgx64
5
L'utilisateur ne peut être spécifié que dans le système crontab
James Roth
J'ai quelques travaux dans les délais sur crontab système. Quand je le fais sudo crontab -e, je vois les emplois. Mais j'ouvre le fichier, /etc/crontabil n'y a pas de travaux. Est-ce bizarre? De plus, si sudo crontab -ej'ajoute un travail avec l'utilisateur spécifié, cela fonctionnera-t-il?
eNeMetcH
14

Puisque vous exécutez Ubuntu, votre crontab système se trouve à /etc/crontab.

En tant qu'utilisateur root (ou en utilisant sudo), vous pouvez simplement modifier ce fichier et spécifier l'utilisateur qui doit exécuter cette commande. Voici le format des entrées dans la crontab système et comment vous devez 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 sûr, les autorisations pour votre script php et votre fichier journal doivent être définies pour que l' www-datautilisateur y ait accès.

pymkin
la source
J'ai pensé que cela devrait être équivalent à crontab -ecependant; mais non.
zinking le
5
La documentation Ubuntu a recommandé de ne pas éditer / etc / crontab car il peut être écrasé par les mises à jour. crontab -e créera un fichier cron spécifique à l'utilisateur dans / var / spool / cron / crontabs.
Hemm
9

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 également: man runuser

Russell E Glaue
la source
runusern'est pas inclus dans Ubuntu.
Raptor
1
runuser est dans la dernière version d'Ubuntu. Il existe également des alternatives à runuser, comme indiqué dans cette réponse unix.stackexchange.com/questions/169441/ubuntu-runuser-command , par exemple su et sudo.
Russell E Glaue
8

La suggestion de Mike semble être la «bonne façon». Je suis tombé sur ce fil voulant spécifier l'utilisateur vncserversous lequel s'exécuter au redémarrage et je voulais conserver tous mes travaux cron au même endroit.

J'obtenais l'erreur suivante pour le cron VNC:

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

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

@reboot sudo -u [someone] vncserver ...
Oliver Moran
la source
1
J'ai eu ce message sur les logs:sudo: sorry, you must have a tty to run sudo
Renato Gama
@renatoargh Vous utilisez probablement RedHat. Jetez un œil à cette réponse sur Unix.SE.
kaiser