Bir cron sekmesi işinin içinde `date` işlemini nasıl yapabilirim?


117

Günlük dosyası adında geçerli saati olan bir cron betiği için bir günlük dosyası oluşturmak istiyorum. Kullanmaya çalıştığım komut buydu:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

Ne yazık ki bu mesajı çalıştırdığımda bu mesajı alıyorum:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

Parçadan kaçmayı dateçeşitli şekillerde denedim ama çok fazla şanssız. Bunun bir crontab dosyasında çevrimiçi olmasını sağlamak mümkün mü yoksa bunu yapmak için bir kabuk betiği mi oluşturmam gerekiyor?

Yanıtlar:


180

Kısa cevap:

Kaçış %olarak \%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

Uzun cevap:

Hata mesajı, komutunuzu çalıştıran kabuğun ikinci arka tik karakterini göremediğini gösterir:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

Bu, diğer cevaplardan birini denediğinizde aldığınız ikinci hata mesajıyla da onaylanır:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

Crontab man sayfasının komut sadece ilk çıkış kullanılmayan kadar okunur onaylar %işareti:

"Altıncı" alan (satırın geri kalanı) çalıştırılacak komutu belirtir. Çizginin komut satırının tamamı, yeni bir satıra veya %karaktere kadar, cronfile değişkeninde /bin/shbelirtilen kabuk tarafından veya bunun tarafından gerçekleştirilir SHELL. Komuttaki yüzde-işaretler ( %), ters eğik çizgi ( \) ile kaçılmadıkça , yeni satır karakterlerine dönüştürülecek ve birinciden sonraki tüm veriler %komuta standart girdi olarak gönderilecektir.


Cehaletim için üzgünüm ama bu hata mesajlarını nerede görüyorsunuz? Ben ne zaman 'grep CRON / var / log / syslog dosyasına' cron başarısız rağmen, hiçbir hata mesajlarını görmek - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@ Копать_Шо_я_нашел cron hata mesajını içeren bir e-posta gönderecek,
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode

7

Ayrıca komutlarınızı bir kabuk dosyasına koyabilir ve ardından kabuk dosyasını cron ile çalıştırabilirsiniz.

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

cron

0 * * * * sh jobs.sh

6

Eğer, (tüm dizeyi çoğaltma önlemek için) bir değişken olarak tarih biçimlendirme dizesi yapmak istiyorsanız YAPMAYIN kaçış %ve YAPMAYIN koydu$()

Örneğin, dizgeyi bildirirken, sadece şunu yazın:

DATEVAR=date +%Y%m%d_%H%M%S

Sonra, cron deyimini $($VARIABLE_NAME)şöyle yaz:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Teşekkür etmek cyberx86 , onu / onun cevabı en ServerFault daha tamamlanmış olabilir:


1
DATEVAR = "tarih +% Y% m% d_% H% M% S"
Frank Fang

3

Cron'da bu basit sözdizimini kullanabilirsiniz:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

Çıkış tarihi formatı cron_20180123.log gibi tekrar çalışacaktır
bala4rtraining

(1) Kabul edilen cevap tarafından söylenmemiş ne diyorsunuz? (2) Cevabınız sorudan çok daha karmaşık. Örneğin -d, soruda kullanılmayan seçeneği eklediniz (ve bunu açıklamadınız). Bu “basit sözdizimi” demeyi nasıl haklı çıkarırsınız?
G-Man

2

Yukarıdaki cevapların tümü çift tırnak kullanır (hepsi benim kurulumum için işe yaramadı). Bu benim için çalıştı:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
Daha önce kabul edilen cevaplarla söylenmemiş ne diyorsun? Tırnak olmadan olduğundan daha iyi çalıştığını mı söylüyorsun? (İpucu: bu pek mümkün değil.)
G-Man

Kabul edilen cevap benim için işe yaramıyor. Bu var.
Manuel Schmitzberger

0

Temel bir çözüm:

  • komutu $()çalıştırmak dateve çıktı almak için kullanın
  • tarih saatini UTC olarak biçimlendirin, %karakterden kaçının\
  • 2>&1sonunda stdoutve stderro günlük dosyasına akış için ekle

Örnek:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

Çıktı:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
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.