Takma adlarımı crontab'ımda nasıl kullanabilirim?


16

İçimde .profileçağırmak istediğim bazı komutlar var crontab.

Örneğin,

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

Sadece takma adı çağırmak istiyorum

0 11 * * * notify-team

Bu yüzden, içindeki listenin .profilegüncellenmesi durumunda crontab, güncellemeyi de yapmak zorunda değilim . Ancak, takma adları kullanamıyorum crontab. Etrafta bir çalışma var mı?

Burada ortamı kurmak için önerileri denedim (örn. / Bin / bash -lc ve script-wrapper script). Görünen o ki betikler için çalışıyor ama takma adlar için değil.

Herhangi bir fikir?


Tüm yararlı bilgiler için teşekkürler. Burada benim de dahil olmak üzere birkaç olası çözüm. Sonunda artifex'in orijinal fikrini durumum için daha yararlı bir şeye değiştirdim. Chris, bunu ayrı komut dosyalarıyla yapmak için gerekli bilgileri sağladı.
Keith Bentrup

Yanıtlar:


10

Takma adlarla ilgili kılavuzdan:

Not diğer adlar etkileşimli olmayan kabukta varsayılan olarak genişletilmez,
ve 'genişletme_aliteleri' ayarlanarak etkinleştirilebilir
shopt kullanarak kabuk seçeneği.

Bu nedenle shopt -s expand_aliases, kaynak kodunuzun başında kullanmayı deneyin . Bu, Warner'ın önerisini kullanmanıza izin vermelidir.


Bu benim için CentOS5'te varsayılan olarak açık. Serin not olsa.
Warner

Muhtemelen bir senaryoda değil. Çıktı veren bir test komut dosyası oluşturmayı deneyin shopt expand_aliases. Bahse girerim kapalı. RHEL 5.3 kutumda.
Christopher Karel

Kafasına çiviyi vurdun. +1
Warner

Bunu işaret ettiğiniz için +1 Thx. Bu beni en çok bir çözüme götürür, ama yine de başka bir dosya oluşturmak zorunda kalıyorum. Bunu onsuz yapmayı umuyordum.
Keith Bentrup

Keith, ben de aynı sorunu yaşadım ama eval 'foo'crontab'da yapmak hile yaptı.
Artem Russakovskii

6

bash -c "source" ile çalışmalıdır:

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

bu da işe yarayabilir. dönem "kaynak" anlamına gelir

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

3

Chris'in tanımladığı gibi, etkileşimli olmayan mermiler için varsayılan kabuk seçeneği takma adları genişletmemek. İşte işe yaradığını bulduğum bir çözüm.

Bir komut dosyası yazın, kabuk seçeneğini etkinleştirin ve takma adlarınızı kaynaklayın. Özellikle .bashrcyürütmede kaynaklandığının bilincinde olun , bu yüzden expand_aliases etkinleştirildikten sonra yeniden kaynaklanması gerekir.

Başlangıçta yanlış tavsiye için özür dilerim. Bu, başlangıçta olmasını beklediğimden daha belirsizdi.

Senaryo:

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

Teşekkürler, ama ben zaten denedim. Sisteminizde çalıştığını doğrulayabilir misiniz? Ben de denedim / bin / bash -lc source ~ / .profile; bildirim ekibi ve diğer varyasyonlar. Ayrıca her takma ad için ayrı bir komut dosyası olmamayı tercih ederim. Bu, tekrardan kaçınmayı amaçlamaktadır.
Keith Bentrup

Ben denedim her varyasyon crontab: "komut bulunamadı" hata dahil olmalıdır.
Keith Bentrup

Test edilmiş bir öneri ile düzenlendi.
Warner

Güncellenmiş örnek için teşekkürler. Eğer 1 satırına -l eklerseniz 3'ünüzden kurtulabilirsiniz.
Keith Bentrup

Ah, iyi çağrı-- giriş kabuğunda expand_aliases etkin olurdu.
Warner

1

Artifex'in takma adı dosyadan yakalama ve ardından yeniden kullanma fikrini seviyorum, çünkü takma adları doğrudan genişletmek / yeniden kullanmak için bir yol bulamadım. (Diğer çözümler için yine başka bir komut dosyası gerekiyordu.)

Bu yüzden bu işlevi yazdım ve .profile dosyama koydum:

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

Sonra crontab'ımda böyle çeşitli takma adlar için kullanabildim:

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

vb.

Yay, kodun yeniden kullanımı! Hepinize teşekkürler.


3
bu saf kötülüktür.
Justin

Takma adı doğrudan kullanabilseydim yapardım. Sorunun konusu bu. Başka bir çözüm önerebilirsiniz, ancak bu çözümü bir dizini tıkayan 2-3 satır dosyası üzerine alacağım - bu, ek bildirim şemaları eklediğimde veya diğer takma adlarımdan bazılarını yeniden kullanmaya karar verdiğimde olacak.
Keith Bentrup

1

Gerçekten yapabileceğiniz en basit şey,

~ / bin / bana bildir

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

~ / bin / notify-team ile

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

kabuk takma adları, gördüğünüz gibi korumak ve diğer sistemlere entegre etmek için karmaşıktır. Yapılacak en iyi şey, onları komik ortam sorunları olmayacak tam teşekküllü komutlara dönüştürmektir.


1
Öneri için teşekkürler, ama takma adların bakımı zor olduğunu hiç düşünmemiştim ve takma adların 1 dosyasını sürdürmeyi ve daha sonra çok sayıda sarmalayıcı dosyasını korumayı tercih ederim. Sorun, takma adları bir cron işinde yürütmekti.
Keith Bentrup

0

bash -ic "notify-team" en iyi seçenektir. Takma adı crontab'da kullanılabilir hale getirir. Ayrıca, -i ile 'etkileşimli' bir kabuk kullandığımız için, ancak gerçekte onunla etkileşimde bulunmadığımız için bir & arka plan ekleyebilirsiniz.


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

benim için çalışıyor


1
Bazı açıklamalar cevabı geliştirir
Dave M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.