crontab fonctionnant en tant qu'utilisateur spécifique

19

Je dois exécuter un script quotidiennement. Le script doit être exécuté en tant qu'utilisateur spécifique (ex. Utilisateur1) et non en tant que root. J'ai donc mis le fichier cron dans /etc/cron.d et mis le nom d'utilisateur dans la ligne (2e colonne). Mais cela donne une erreur indiquant que la commande est introuvable. Je soupçonne que le script n'a pas été exécuté en tant qu'environnement de user1. Ai-je oublié quelque chose?

Sam Kong
la source
3
Pouvez-vous nous montrer l'entrée crontab que vous utilisez, s'il vous plaît?
user9517

Réponses:

33

Seuls /etc/crontables fichiers et /etc/cron.d/contiennent un champ de nom d'utilisateur. Dans ce fichier, vous pouvez faire ceci:

1 1 * * * username /path/to/your/script.sh

Depuis le crontab de root, sudo crontab -evous pouvez utiliser:

1 1 * * * su username -c "/path/to/your/script.sh"

Ou vous pouvez utiliser le crontab réel de l'utilisateur comme ceci:

sudo crontab -u username -e

La deuxième colonne de tout fichier crontab correspond à l'heure à laquelle vous souhaitez exécuter le travail. Voulez-vous dire le sixième champ?

Ladadadada
la source
Le fichier dans /etc/cron.d prend un argument utilisateur: help.ubuntu.com/community/CronHowto#Advanced_Crontab et pourquoi faites-vous "sudo su" si vous exécutez en tant que root? Dans tous les cas, vous souhaiterez que "su -l" utilise l'environnement de connexion pour l'utilisateur, car il s'agit très probablement d'un problème de CHEMIN, d'après la description du problème.
cjc
Les fichiers dans /etc/cron.d ne sont-ils pas une extension de / etc / crontab? Sur les systèmes, je dois remettre tous les fichiers dans /etc/cron.d ont un nom d'utilisateur spécifié.
user9517
Ah, en effet. /etc/cron.d/les fichiers font partie de /etc/crontab. sudoest également inutile. Je vais supprimer cette partie.
Ladadadada
2
Concernant la mise de sudo dans le crontab: (a) sudo su... est généralement inutile; sudo -u <user> <command>est généralement suffisant. (b) sudo s'étouffera sur certains systèmes s'il n'y a pas de TTY attaché (comme lorsqu'il est exécuté par cron). Cela peut être corrigé dans votre fichier sudoers.
tylerl
4

Vous devrez peut-être définir le CHEMIN pour cet utilisateur, si l'exécutable que vous utilisez se trouve, par exemple, dans / usr / local / bin. Pour définir le CHEMIN, placez quelque chose comme ceci avant les tâches cron:

PATH=/bin:/usr/bin:/usr/local/bin

*/5 * * * * user1 sample_executable

L'autre façon est de spécifier complètement le chemin vers sample_executable dans votre cronjob, donc:

*/5 * * * * user1 /path/to/sample_executable

Si sample_executable fait référence aux exécutables qui ne se trouvent pas dans le PATH standard, vous devez utiliser la première option.

cjc
la source
1

Le répertoire typique des crontabs utilisateur se trouve dans / var / spool / cron / crontabs. Le format de fichier est celui qui n'inclut pas le nom d'utilisateur. Les crontabs utilisateur sont la propriété de l'utilisateur et portent le nom de l'utilisateur avec le mode 0600. Ceci est mieux géré en écrivant votre fichier tab et en utilisant crontab -u username filenamepour configurer les entrées cron que vous voulez pour cet utilisateur.

Jeff Ferland
la source