Comment utiliser mes alias dans mon crontab?

16

J'ai quelques commandes dans ma .profileque je veux invoquer depuis ma crontab.

Par exemple, si j'ai,

alias notify-me="~/bin/notify.pl -u user1"
alias notify-team="~/bin/notify.pl -u user1 user2 user3 user4 ...."

Je voudrais simplement invoquer l'alias

0 11 * * * notify-team

donc si la liste dans mon .profileest mise à jour, je n'ai pas besoin de la mettre à jour crontabaussi. Cependant, je ne semble pas pouvoir utiliser d'alias dans mon crontab. Y at-il un travail autour?

J'ai essayé les suggestions ici pour configurer l'environnement (par exemple / bin / bash -lc et le script wrapper de script). Il semble que cela fonctionne pour les scripts mais pas pour les alias.

Des idées?

Keith Bentrup
la source
Merci à tous pour les informations utiles. Quelques solutions possibles ici, y compris la mienne. J'ai finalement modifié l'idée originale d'Artefex en quelque chose de plus utile pour ma situation. Chris a fourni les informations nécessaires pour le faire avec des scripts séparés.
Keith Bentrup

Réponses:

10

À partir de la page de manuel concernant les alias:

Notez que les alias ne sont pas développés par défaut dans un shell non interactif,
et il peut être activé en définissant les 'expand_aliases'
option shell utilisant shopt.

Essayez donc d'utiliser shopt -s expand_aliasesau début de votre script de sourcing. Cela devrait vous permettre d'utiliser la suggestion de Warner.

Christopher Karel
la source
C'est activé pour moi sur CentOS5 par défaut. Note sympa cependant.
Warner
Mais probablement pas dans un script. Essayez de créer un script de test qui sort shopt expand_aliases. Je parie que c'est éteint. C'est dans ma boite RHEL 5.3.
Christopher Karel
Vous frappez le clou sur la tête. +1
Warner
+1 Thx pour l'avoir signalé. Cela me permet de trouver une solution, mais je dois toujours créer un autre fichier. J'espérais le faire sans ça.
Keith Bentrup
Keith, j'ai eu le même problème mais faire eval 'foo'dans crontab a fait l'affaire.
Artem Russakovskii
6

bash -c avec "source" devrait fonctionner:

0 11 * * * bash -c "source .profile && notify-team"

cela pourrait également fonctionner. la période signifie "source"

0 11 * * * . .profile && notify-team
Collin Anderson
la source
3

Comme Chris l'a identifié, l'option de shell par défaut pour les shells non interactifs est de ne pas étendre les alias. Voici une solution que j'ai trouvée efficace.

Écrivez un script, activez l'option shell et sourcez vos alias. Soyez particulièrement conscient du fait qu'il .bashrcprovient à l'exécution, c'est pourquoi il doit être à nouveau généré après avoir activé expand_aliases.

Mes excuses pour la recommandation initialement incorrecte. C'était plus obscur que ce à quoi je m'attendais initialement.

Scénario:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
Warner
la source
Thx, mais j'ai déjà essayé ça. Pouvez-vous confirmer que cela fonctionne sur votre système? J'ai également essayé / bin / bash -lc source ~ / .profile; l'équipe de notification et d'autres variantes. Je préfère également ne pas avoir de script séparé pour chaque alias. Cela va à l'encontre du but d'éviter les doubles emplois.
Keith Bentrup
J'aurais dû inclure l'erreur de crontab: "commande introuvable" sur chaque variante que j'ai essayée.
Keith Bentrup
Modifié avec une recommandation testée.
Warner
Thx pour l'exemple mis à jour. Je pense que si vous ajoutez -l à votre 1ère ligne, vous pouvez vous débarrasser de votre 3ème.
Keith Bentrup
Ah, bon appel - le shell de connexion aurait activé expand_aliases.
Warner
1

J'aime l'idée d'Artefex de récupérer l'alias du fichier puis de le réutiliser, car je n'ai pas trouvé de moyen d'étendre / réutiliser les alias directement. (D'autres solutions nécessitaient toujours un autre script.)

J'ai donc écrit cette fonction et l'ai mise dans mon .profile:

grab-alias () { sed -n '/alias\s*'$1'\s*=/ {s/[^'\'']*.//;s/'\''\s*$//p}' /home/bentrupk/.profile; }

Ensuite, j'ai pu l'utiliser dans mon crontab pour divers alias comme celui-ci:

0 11 * * * /bin/bash -lc 'x=`grab-alias notify-team`; $x'
0 7 * * * /bin/bash -lc 'x=`grab-alias notify-me`; $x'

etc.

Ouais, réutilisation du code! Merci a tous.

Keith Bentrup
la source
3
c'est du mal pur.
Justin
Si je pouvais utiliser l'alias directement, je le ferais. Voilà le point de la question. Vous êtes invités à proposer une autre solution, mais je prendrai cette solution sur de nombreux fichiers de 2 à 3 lignes encombrant un répertoire - ce qui se passera lorsque j'ajoute des schémas de notification supplémentaires ou décide de réutiliser certains de mes autres alias.
Keith Bentrup
1

La chose la plus simple à faire serait de créer

~ / bin / informez-moi avec

#!/bin/sh
~/bin/notify.pl -u user1

~ / bin / notify-team avec

#!/bin/sh
~/bin/notify.pl -u user1 user2 user3 user4 ....

les alias de shell sont compliqués à maintenir et à intégrer dans d'autres systèmes, comme vous l'avez vu. la meilleure chose à faire est de les transformer en commandes à part entière qui n'auront pas de problèmes d'environnement drôles.

Justin
la source
1
Merci pour la suggestion, mais je n'ai jamais pensé que les alias étaient difficiles à gérer, et je préfère conserver 1 fichier d'alias, puis conserver de nombreux fichiers wrapper. Le problème était l'exécution des alias dans une tâche cron.
Keith Bentrup
0

bash -ic "notify-team" est la meilleure option. Il rend l'alias disponible dans crontab. Vous pouvez en outre ajouter un & for background car nous utilisons un shell «interactif» avec -i, mais en réalité, nous n'interagissons pas avec lui.

SuperGeek
la source
-2
0 11 * * * bash -ic "notify-team" > /log/file

travaille pour moi

vakhrymchuk
la source
1
Une explication améliorerait la réponse
Dave M