¿Cómo usar mis alias en mi crontab?

16

Tengo algunos comandos en mi .profileque quiero invocar desde mi crontab.

Por ejemplo, si tengo,

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

Me gustaría invocar el alias

0 11 * * * notify-team

así que si la lista en mi .profileestá actualizada, no tengo que actualizarla crontabtambién. Sin embargo, parece que no puedo usar alias en mi crontab. ¿Hay alguna solución?

Intenté las sugerencias aquí para configurar el entorno (p. Ej. / Bin / bash -lc y el script script-wrapper). Parece que eso funciona para los scripts pero no para los alias.

¿Algunas ideas?

Keith Bentrup
fuente
Gracias a todos por la información útil. Un par de posibles soluciones aquí, incluida la mía. Finalmente modifiqué la idea original de artifex a algo más útil para mi situación. Chris proporcionó la información necesaria para hacerlo con guiones separados.
Keith Bentrup

Respuestas:

10

De la página de manual sobre alias:

Los alias de nota no se expanden de forma predeterminada en el shell no interactivo,
y se puede habilitar configurando 'expand_aliases'
opción de shell usando shopt.

Así que intente usarlo shopt -s expand_aliasesal comienzo de su secuencia de comandos de abastecimiento. Esto debería permitirle usar la sugerencia de Warner.

Christopher Karel
fuente
Esto está activado para mí en CentOS5 por defecto. Nota genial sin embargo.
Warner
Sin embargo, probablemente no en un guión. Intenta crear un script de prueba que salga shopt expand_aliases. Apuesto a que está apagado. Está en mi caja RHEL 5.3.
Christopher Karel
Le diste al clavo. +1
Warner
+1 Thx por señalar esto. Me lleva la mayor parte del camino a una solución, pero aún así tengo que crear otro archivo. Esperaba hacerlo sin eso.
Keith Bentrup
Keith, tuve el mismo problema, pero hacerlo eval 'foo'en crontab funcionó.
Artem Russakovskii
6

bash -c con "fuente" debería funcionar:

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

Esto también podría funcionar. el período significa "fuente"

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

Como Chris identificó, la opción de shell predeterminada para shells no interactivos es no expandir los alias. Aquí hay una solución que he encontrado que funciona.

Escriba una secuencia de comandos, habilite la opción de shell y obtenga sus alias. Tenga especialmente en cuenta que .bashrcse origina en la ejecución, razón por la cual se debe obtener nuevamente después de habilitar expand_aliases.

Mis disculpas por la recomendación inicialmente incorrecta. Esto fue más oscuro de lo que inicialmente esperaba.

Guión:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
Warner
fuente
Gracias, pero ya lo he intentado. ¿Puedes confirmar que funciona en tu sistema? También probé / bin / bash -lc source ~ / .profile; notificar al equipo y otras variaciones. También prefiero no tener un script separado para cada alias. Eso anula el propósito de evitar la duplicación.
Keith Bentrup
Debería haber incluido el error de crontab: "comando no encontrado" en cada variación que he probado.
Keith Bentrup
Editado con una recomendación probada.
Warner
Thx para el ejemplo actualizado. Creo que si agrega -l a su primera línea, puede deshacerse de su tercera.
Keith Bentrup
Ah, buena llamada: el shell de inicio de sesión habría habilitado expand_aliases.
Warner
1

Me gusta la idea de artifex de tomar el alias del archivo y luego reutilizarlo, ya que no pude encontrar una manera de expandir / reutilizar los alias directamente. (Otras soluciones aún requerían otro script).

Entonces escribí esta función y la puse en mi .profile:

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

Luego pude usarlo en mi crontab para varios alias como este:

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

etc.

¡Yay, código reutilizado! Gracias a todos.

Keith Bentrup
fuente
3
Eso es pura maldad.
Justin
Si pudiera usar el alias directamente, lo haría. Ese es el punto de la pregunta. Le invitamos a proponer otra solución, pero tomaré esta solución en muchos archivos de 2-3 líneas que abarrotan un directorio, que es lo que sucederá cuando agregue esquemas de notificación adicionales o decida reutilizar algunos de mis otros alias.
Keith Bentrup
1

Realmente lo más simple que podrías hacer sería crear

~ / bin / notifícame con

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

~ / bin / notify-team con

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

Los alias de shell son complicados de mantener e integrar en otros sistemas, como has visto. Lo mejor que puede hacer es convertirlos en comandos completos que no tengan problemas de entorno divertidos.

Justin
fuente
1
Gracias por su sugerencia, pero nunca pensé que los alias fueran difíciles de mantener, y prefiero mantener 1 archivo de alias y luego muchos archivos de contenedor. El problema fue ejecutar los alias en un trabajo cron.
Keith Bentrup
0

bash -ic "notificar al equipo" es la mejor opción. Hace que el alias esté disponible en crontab. También puede agregar un & para el fondo ya que estamos usando un shell 'interactivo' con -i, pero en realidad no interactúa con él.

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

funciona para mi

vakhrymchuk
fuente
1
Alguna explicación mejoraría la respuesta
Dave M