Como usar meus aliases no meu crontab?


16

Eu tenho alguns comandos no meu .profileque eu quero chamar do meu crontab.

Por exemplo, se eu tiver,

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

Eu gostaria de invocar o alias

0 11 * * * notify-team

portanto, se a lista no meu .profilefor atualizada, não preciso atualizar o crontabtambém. No entanto, parece que não consigo usar aliases no meu crontab. Existe uma solução alternativa?

Tentei as sugestões aqui para configurar o ambiente (por exemplo, / bin / bash -lc e o script wrapper de script). Parece que isso funciona para scripts, mas não para aliases.

Alguma ideia?


Obrigado, tudo pela informação útil. Algumas soluções possíveis aqui, incluindo a minha. Eu finalmente modifiquei a idéia original do artifex para algo mais útil para a minha situação. Chris forneceu as informações necessárias para fazer isso com scripts separados.
— Keith Bentrup

Respostas:


10

Na página de manual sobre aliases:

Observe que os aliases não são expandidos por padrão no shell não interativo,
e pode ser ativado configurando as 'expand_aliases'
opção shell usando shopt.

Portanto, tente usar shopt -s expand_aliasesno início do seu script de fornecimento. Isso deve permitir que você use a sugestão da Warner.


Isso está ativado para mim no CentOS5 por padrão. Nota legal embora.
— Warner

Provavelmente não em um script, no entanto. Tente criar um script de teste que produza shopt expand_aliases. Aposto que está fora. Está na minha caixa do RHEL 5.3.
— 49420 Christopher

Você acerta o prego na cabeça. 1
— Warner

+1 Thx por apontar isso. Isso me leva a uma solução, mas ainda preciso criar outro arquivo. Eu esperava fazer isso sem isso.
— perfil completo de Keith Bentrup

Keith, eu tive o mesmo problema, mas fazer o eval 'foo'crontab fez o truque.
— Artem Russakovskii

6

bash -c com "fonte" deve funcionar:

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

isso também pode funcionar. o período significa "fonte"

0 11 * * * . .profile && notify-team

3

Como Chris identificou, a opção de shell padrão para shells não interativos é não expandir aliases. Aqui está uma solução que eu encontrei para trabalhar.

Escreva um script, ative a opção shell e crie seus aliases. Esteja ciente de que .bashrcé originário na execução, e é por isso que deve ser originado novamente depois de ativar o expand_aliases.

Peço desculpas pela recomendação inicialmente incorreta. Isso foi mais obscuro do que eu esperava inicialmente.

Roteiro:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team

Thx, mas eu já tentei isso. Você pode confirmar que funciona no seu sistema? Eu também tentei / bin / bash -lc source ~ / .profile; equipe de notificação e outras variações. Também prefiro não ter um script separado para cada alias. Isso anula o objetivo de evitar duplicação.
— Keith Bentrup

Eu deveria ter incluído o erro do crontab: "comando não encontrado" em todas as variações que tentei.
— Keith Bentrup

Editado com uma recomendação testada.
— Warner

Thx para o exemplo atualizado. Acho que se você adicionar -l à sua primeira linha, poderá se livrar da sua terceira.
— Keith Bentrup

Ah, boa chamada - o shell de login teria expand_aliases ativado.
— 213 Warner Warner

1

Gosto da ideia do artifex de pegar o alias do arquivo e depois reutilizá-lo, pois não consegui encontrar uma maneira de expandir / reutilizar aliases diretamente. (Outras soluções ainda exigem outro script.)

Então, eu escrevi essa função e coloquei no meu .profile:

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

Pude usá-lo no meu crontab para vários aliases 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.

Sim, reutilização de código! Obrigado a todos.


3
isso é puro mal.
— Justin

Se eu pudesse usar o alias diretamente, usaria. Esse é o ponto da questão. Você pode propor outra solução, mas eu levarei essa solução para vários arquivos de 2 a 3 linhas que bagunçam um diretório - que é o que acontecerá se eu adicionar esquemas de notificação adicionais ou decidir reutilizar alguns dos meus outros aliases.
— Keith Bentrup

1

Realmente, a coisa mais simples que você poderia fazer seria criar

~ / bin / notifique-me com

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

~ / bin / equipe de notificação com

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

os aliases de shell são complicados de manter e integrar em outros sistemas, como você viu. a melhor coisa a fazer é transformá-los em comandos completos que não terão problemas engraçados no ambiente.


11
Obrigado pela sugestão, mas nunca pensei que fosse difícil manter aliases, e prefiro manter 1 arquivo de aliases do que manter muitos arquivos de wrapper. O problema estava executando os aliases em um trabalho cron.
— Keith Bentrup

0

bash -ic "notify-team" é a melhor opção. Torna o alias disponível no crontab. Você também pode adicionar um & for background, pois estamos usando um shell 'interativo' com -i, mas na realidade não estamos interagindo com ele.


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

funciona para mim


11
Alguma explicação iria melhorar a resposta
— Dave M
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.