Bu iki cron işinde yanlış olan ne?


13

Aşağıdaki cron işleri tanımlanmış.

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'

Yukarıdaki komutu doğrudan komut satırından çalıştırırsam düzgün çalışıyor gibi görünüyor. Ama bu sabah senaryonun çalışmasını kontrol ettiğimde, arka kenelerin düzgün bir şekilde kapatılmadığını belirten bir e-posta aldım (yanlışlıkla silindim çünkü yorum yapıyorum).


FYI Sadece cron işlerini tekrar test ettim ve aşağıdaki hataları aldım. /bin/sh: 1: Syntax error: EOF in backquote substitution İlk cron işi için. /bin/sh: 1: Syntax error: Unterminated quoted string İkinci cron işi için.
Mark D

2
Bu nedenle geri tepmeler kullanımdan kaldırılmıştır ; olarak değiştirmek $(...)alıntı sorunları ile başa çıkmak için yardımcı olacaktır ...
jasonwryan

1
Kesinlikle bir sorumu kontrol etmek istiyorsun. Stephane Chazelas'ın, cron işinizin göreceği ortamla aynı olan etkileşimli bir kabuğu nasıl oluşturabileceğinizi açıklayan bir cevabı var. Küçük prosedüründen geçerseniz, bir istem alırsınız ve cronjob'ınızı adım adım test edebilir ve nerede başarısız olduğunu görebilirsiniz. unix.stackexchange.com/a/56503/16841 Sorunuz için% 100 eşleşme olmadığından emin olun, ancak crontab sorunlarını gidermenize yardımcı olabilir.
jippie

Yanıtlar:


14

Önemsiz cron işlerini birçok nedenden dolayı kendi kabuk komut dosyasına koymanızı şiddetle tavsiye ederim:

  • Hata ayıklamak daha kolay: uzun bir satırı yapıştırmak yerine komut dosyasını çalıştırabilirsiniz ve doğru shebang satırıyla, aynı komutları doğrudan crontab'da sahip olduğunuzdan çok daha öngörülebilir şekilde davranır.
  • Daha kolay okunabilir: 200'den fazla karakterli bir astar yapmaya gerek yok, güzelce biçimlendirebilirsiniz, böylece herkes için okunması ve anlaşılması kolaydır
  • Komut dosyasını sürüm denetimine ekleme

8
Ve zahmetli %karakterleri senaryoya koymak, crononları yeni satırlara dönüştürmeyi engelleyecektir , ki bu sizin gerçek probleminizdir.
Ian D. Allen

Katılmıyorum. Hangi betiğin ne yaptığını unutma eğilimindesiniz. Deneyimden bahsediyorum.
Sridhar Sarnobat

30

Cron iş komutlarının, doğrudan etkileşimli bir kabuğa yazılan komutlara kıyasla, yaygın sıraya göre farklı davranmasının üç yaygın nedeni vardır:

  • Cron sınırlı bir ortam sağlar, örneğin minimal $PATHve beklenen diğer değişkenler eksiktir.
  • Cron /bin/shvarsayılan olarak çağırır , oysa etkileşimli olarak başka bir kabuk kullanıyor olabilirsiniz.
  • Cron %karakteri özel olarak ele alır (komutta yeni bir satıra dönüştürülür).
  • Cron terminal veya grafik ortamı sağlamaz.

Tüm %karakterlerden önce \crontab dosyasında bir c ile yer almalısınız ; bu, cron'a komutun içine yalnızca yüzde koymasını söyler. dateKomutu bir cron işinde kullandığınızı unutmayın .

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"

Ayrıca bazı alıntı sorunları giderdim:

  • Bu, okunaklılık dışında sorunlara neden olmuyordu, ancak komut yerine koymak için backtick kullanmamalısınız. $(…)Bunun yerine kullanın : ayrıştırma kuralları daha basittir.
  • Değişken ve komut ikameleri için her zaman çift tırnak kullanın: "$somevariable", "$(somecommand)". Burada tırnak eksikliği zararsızdı, çünkü datekomut kullandığınız formatlar için herhangi bir özel karakter döndürmedi, ancak hangi karakterlerin özel olduğunu dikkatlice hatırlamanız ve her değiştirmeden ayrıldığınızda bunu kontrol etmeniz gerekiyor. Basit olun, sonuçta alan bölme ve dosya adı oluşturma işleminin olmasını istemediğiniz sürece her zaman çift tırnak kullanın.
  • Bazı komut ikamelerinin etrafında genişlemeyi engelleyen bazı tek tırnaklarınız vardı. Bunun yerine çift tırnak kullanın.

0

Sen iç içe gibi görünüyor 'içinde muttkomuta:

'Olaylar date +%Y-%m-%d --date='last Wednesday'- date +%Y-%m-%d'

Kullanmayı deneyin "iç yerine 'ifadesi okur böylece

'Olaylar date +%Y-%m-%d --date="last Wednesday"- date +%Y-%m-%d'


Sorunun bu olduğundan emin değilim. Ancak her iki cron işinde de bir şans verdikten sonra herhangi bir başarı olmadan infaz.
Mark D
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.