1 votes

La tâche cron ne fonctionne pas quand elle est placée dans `/etc/cron.hourly/` mais fonctionne quand elle est définie dans `crontab -e`.

Si je définis mon planificateur cron via crontab -e le planificateur fonctionne correctement. Cependant, en plaçant le fichier dans /etc/cron.hourly/ ne fonctionne pas dans mon cas.

Running run-parts --test /etc/cron.hourly sortir le script. Aussi, le nom du script est my_sql_backup et n'a pas d'extension de fichier.

Le script est root:root avec la permission de 777.

Le site cron.hourly semble fonctionner, car voici la sortie de l'application grep CRON /var/log/syslog :

Mar  1 11:17:01 my-instance CRON[12919]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

De plus, si j'ai exécuté manuellement la commande, le planificateur a fonctionné comme il le devait :

sudo bash -c "cd / && run-parts --report /etc/cron.hourly"

Cependant, cela semble ne pas fonctionner en réalité. Le script sauvegarde la base de données MySQL dans Google Cloud Storage, mais le stockage n'est pas mis à jour lorsque je le vérifie via la console Web.

Est-ce qu'il y a quelque chose que je manque ici ? Pourquoi mon scheduler script qui a été mis en /etc/cron.hourly/ ne fonctionne pas ?


UPDATE

Ayant ajouté le echo test > /tmp/foobar.tmp à mon cron script, j'ai trouvé que le fichier tmp est là. En fait, j'ai trouvé mon propre fichier tmp émis par le script.

Le contenu du script est le suivant. Le problème s'est peut-être produit lors de l'exécution de gsutil commande ?

# define environment variables here
sudo sh -c "mysqldump -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DBNAME --single-transaction | gzip -9 > $MYSQL_TEMPPATH" >/dev/null 2>&1
gsutil cp $MYSQL_TEMPPATH gs://$GS_BUCKET_NAME/$MYSQL_S3_DESTPATH >/dev/null 2>&1

Encore une fois, le script fonctionnait bien si je l'exécutais manuellement, donc les variables d'environnement sont définies sur des valeurs correctes....


MISE À JOUR 2

J'ai finalement trouvé qu'après avoir obtenu le fichier journal émis par gsutil il a le contenu suivant :

AccessDeniedException : 403 Portée OAuth2 insuffisante pour effectuer cette opération.

Je dois encore chercher à savoir pourquoi l'accès est refusé s'il est exécuté en /etc/cron.hourly/ ... Mais le problème était sur gcloud pas cron... Merci pour le soutien dans les commentaires.

1voto

naio Points 113

Après avoir examiné la sortie du journal, j'ai finalement découvert que le fichier journal contenait le contenu suivant, qui provient de l'application de l'utilisateur. gcloud exécution :

AccessDeniedException : 403 Portée OAuth2 insuffisante pour effectuer cette opération.

Donc le problème était sur gcloud et non pas cron.

Alors comment éviter l'erreur d'accès refusé sur gcloud ?

Afin d'accorder à VM l'accès au stockage en nuage, procédez comme suit :

  1. Arrêtez votre instance VM

  2. Modifiez votre VM pour changer le stockage en nuage de Lire a Lecture/Écriture .

  3. Redémarrez votre VM

Et maintenant, je l'ai finalement fait fonctionner comme prévu...

La source : https://stackoverflow.com/a/41604071/2360798

-1voto

Mattio Points 817

Vous n'avez pas fourni suffisamment d'informations sur le script pour comprendre ce qu'il est censé faire ni pourquoi il pourrait échouer dans une tâche cron - il y a quelques raisons courantes.

Cependant, le titre et le premier paragraphe de votre question (sur les crontabs utilisateur et root) semblent suffisamment clairs, alors répondons-y :

Les crontabs de l'utilisateur et de l'utilisateur root ont des formats légèrement différents et ne sont pas interchangeables.

Exemple :

1 1 * * * root /bin/foo   // root crontab in /etc/cron*
1 1 * * * /bin/foo        // user crontab in /var/spool (see it using the 'crontab' command

Vous voyez la différence ? Une crontab root a un champ supplémentaire pour spécifier l'utilisateur. L'utilisateur n'est pas nécessairement root.... bien qu'en pratique il s'agisse généralement de root.

Disons que vous voulez exécuter un travail de sauvegarde de la base de données. Ajoutez un crontab racine à /etc/cron.d/ qui déclenche votre script de sauvegarde. Il suffit de déclencher. Une erreur commune est de rendre le crontab plus complexe qu'il ne doit l'être. Toute la logique et le contrôle d'erreur et les permissions et la journalisation devraient être dans le script, pas dans le crontab.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X