Come usare i miei alias nel mio crontab?


16

Ho alcuni comandi nel mio .profileche desidero richiamare dal mio crontab.

Ad esempio, se ho,

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

Vorrei solo invocare l'alias

0 11 * * * notify-team

quindi se l'elenco nel mio .profileè aggiornato, non devo aggiornare crontabanche quello. Tuttavia, non riesco a usare gli alias nel mio crontab. C'è un lavoro in giro?

Ho provato i suggerimenti qui per impostare l'ambiente (ad esempio / bin / bash -lc e lo script script-wrapper). Sembra che funzioni per gli script ma non per gli alias.

Qualche idea?


Grazie a tutti per le informazioni utili. Abbina qui possibili soluzioni tra cui la mia. Alla fine ho modificato l'idea originale di Artifex in qualcosa di più utile per la mia situazione. Chris ha fornito le informazioni necessarie per farlo con script separati.
Keith Bentrup,

Risposte:


10

Dalla manpage relativa agli alias:

Gli alias delle note non vengono espansi per impostazione predefinita nella shell non interattiva,
e può essere abilitato impostando 'expand_aliases'
opzione shell usando shopt.

Quindi prova a utilizzare shopt -s expand_aliasesall'inizio dello script di sourcing. Questo dovrebbe permetterti di usare il suggerimento di Warner.


Questo è attivo per me su CentOS5 per impostazione predefinita. Nota interessante però.
Warner

Probabilmente non in una sceneggiatura, però. Prova a creare uno script di prova che genera shopt expand_aliases. Scommetto che è spento. È nella mia scatola RHEL 5.3.
Christopher Karel,

Hai colpito il chiodo sulla testa. +1
Warner

+1 Thx per la precisazione. Mi porta quasi a una soluzione, ma finisco comunque per creare un altro file. Speravo di farlo senza quello.
Keith Bentrup

Keith, ho avuto lo stesso problema, ma fare eval 'foo'in crontab ha fatto il trucco.
Artem Russakovskii,

6

bash -c con "source" dovrebbe funzionare:

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

questo potrebbe anche funzionare. il periodo significa "fonte"

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

3

Come ha identificato Chris, l'opzione di shell predefinita per le shell non interattive è quella di non espandere gli alias. Ecco una soluzione che ho trovato per funzionare.

Scrivi uno script, abilita l'opzione shell e crea i tuoi alias. Essere particolarmente consapevoli del fatto che .bashrcproviene dall'esecuzione, motivo per cui deve essere di nuovo reperito dopo aver abilitato expand_aliases.

Mi scuso per la raccomandazione inizialmente errata. Questo era più oscuro di quanto inizialmente mi aspettassi.

script:

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

Grazie, ma ci ho già provato. Puoi confermare che funziona sul tuo sistema? Ho anche provato / bin / bash -lc source ~ / .profile; squadra di notifica e altre varianti. Inoltre preferisco non avere uno script separato per ogni alias. Ciò vanifica lo scopo di evitare la duplicazione.
Keith Bentrup

Avrei dovuto includere l'errore di crontab: "comando non trovato" su ogni variante che ho provato.
Keith Bentrup

Modificato con una raccomandazione testata.
Warner

Grazie per l'esempio aggiornato. Penso che se aggiungi -l alla tua prima linea puoi sbarazzarti della tua terza.
Keith Bentrup

Ah, buona chiamata, la shell di accesso avrebbe expander_aliases abilitato.
Warner

1

Mi piace l'idea di artifex di afferrare l'alias dal file e poi riutilizzarlo, dal momento che non riuscivo a trovare un modo per espandere / riutilizzare direttamente gli alias. (Altre soluzioni richiedono ancora un altro script.)

Quindi ho scritto questa funzione e l'ho inserita nel mio .profile:

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

Quindi sono stato in grado di usarlo nel mio crontab per vari alias come questo:

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

eccetera.

Sì, riutilizzo del codice! Ringrazia tutti.


3
questo è puro male.
Giustino,

Se potessi usare direttamente l'alias, lo farei. Questo è il punto della domanda. Sei il benvenuto a proporre un'altra soluzione, ma prenderò questa soluzione su molti file di 2-3 righe che ingombrano una directory - che è ciò che accadrà quando aggiungo ulteriori schemi di notifica o decido di riutilizzare alcuni dei miei altri alias.
Keith Bentrup

1

La cosa più semplice che potresti fare sarebbe creare

~ / bin / avvisami con

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

~ / bin / notification-team con

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

gli alias di shell sono complicati da mantenere e da integrare in altri sistemi, come hai visto. la cosa migliore da fare è trasformarli in comandi completi che non avranno problemi ambientali divertenti.


1
Grazie per il suggerimento, ma non ho mai pensato che gli alias fossero difficili da mantenere, e preferirei mantenere 1 file di alias quindi mantenere molti file wrapper. Il problema era l'esecuzione degli alias in un processo cron.
Keith Bentrup

0

bash -ic "notification-team" è l'opzione migliore. Rende l'alias disponibile in crontab. Puoi aggiungere un & per lo sfondo poiché stiamo usando una shell 'interattiva' con -i, ma in realtà non interagiamo con essa.


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

per me va bene


1
Alcune spiegazioni migliorerebbero la risposta
Dave M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.