Bagaimana saya bisa menjalankan `date` di dalam pekerjaan tab cron?

117

Saya ingin membuat file log untuk skrip cron yang memiliki jam saat ini di nama file log. Ini adalah perintah yang saya coba gunakan:

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

Sayangnya saya mendapatkan pesan ini ketika itu berjalan:

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

Saya telah mencoba melarikan diri dari datebagian ini dengan berbagai cara, tetapi tidak berhasil. Apakah mungkin membuat ini terjadi secara in-line dalam file crontab atau apakah saya perlu membuat skrip shell untuk melakukan ini?

cwd
sumber

Jawaban:

180

Jawaban singkat:

Lari %sebagai \%:

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

Jawaban panjang:

Pesan kesalahan menyarankan bahwa shell yang mengeksekusi perintah Anda tidak melihat karakter tick back kedua:

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

Ini juga dikonfirmasi oleh pesan kesalahan kedua yang Anda terima ketika Anda mencoba salah satu jawaban lain:

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

The crontab manualnya menegaskan bahwa perintah dibaca hanya sampai unescaped pertama %tanda:

Kolom "keenam" (sisa baris) menentukan perintah yang akan dijalankan. Seluruh bagian perintah baris, hingga baris baru atau %karakter, akan dieksekusi oleh /bin/shatau oleh shell yang ditentukan dalam SHELLvariabel cronfile. Tanda persen ( %) dalam perintah, kecuali lolos dengan backslash ( \), akan diubah menjadi karakter baris baru , dan semua data setelah yang pertama %akan dikirim ke perintah sebagai input standar.

Adam Zalcman
sumber
Maaf atas ketidaktahuan saya, tetapi di mana Anda melihat pesan kesalahan ini? Ketika saya melakukan 'grep CRON / var / log / syslog' Saya tidak melihat pesan kesalahan, meskipun cron gagal - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe
2
@ Копать_Шо_я_нашел cron akan mengirim email dengan pesan kesalahan,
Jasen
3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode
7

Anda juga bisa memasukkan perintah ke file shell dan kemudian mengeksekusi file shell dengan cron.

jobs.sh

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

cron

0 * * * * sh jobs.sh
Trevi Awater
sumber
6

Jika Anda ingin menjadikan string format tanggal sebagai variabel (untuk menghindari duplikasi seluruh string), JANGAN lepas %dan JANGAN memasukkannya ke dalam$()

Misalnya, saat mendeklarasikan string, cukup tulis:

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

Kemudian, tulis pernyataan cron dengan $($VARIABLE_NAME)seperti ini:

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

Berkat cyberx86 , jawabannya di ServerFault mungkin lebih lengkap:

Gawi - Kai
sumber
1
DATEVAR = "tanggal +% Y% m% d_% H% M% S"
Frank Fang
3

Di cron, Anda dapat menggunakan sintaks sederhana ini:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1
bala4rtraining
sumber
Format tanggal keluaran akan kembali seperti cron_20180123.log
bala4rtraining
(1) Apa yang Anda katakan yang belum diucapkan oleh jawaban yang diterima? (2) Jawaban Anda jauh lebih rumit daripada pertanyaan. Misalnya, Anda menambahkan -dopsi, yang tidak digunakan dalam pertanyaan (dan Anda tidak menjelaskannya). Bagaimana Anda membenarkan menyebut ini "sintaks sederhana"?
G-Man
2

Semua jawaban di atas menggunakan tanda kutip ganda (tidak semuanya bekerja untuk pengaturan saya). Ini bekerja untuk saya:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1
Manuel Schmitzberger
sumber
1
Apa yang Anda katakan yang belum diucapkan oleh jawaban yang diterima? Apakah Anda mengatakan bahwa itu bekerja lebih baik tanpa tanda kutip daripada dengan tanda kutip? (Petunjuk: itu sangat tidak mungkin.)
G-Man
Jawaban yang diterima sama sekali tidak bekerja untuk saya. Yang ini.
Manuel Schmitzberger
0

Solusi dasar:

  • gunakan $()untuk mengeksekusi dateperintah dan mengembalikan output
  • memformat datetime ke UTC, keluar dari %karakter dengan\
  • tambahkan 2>&1di akhir untuk streaming keduanya stdoutdan stderrke file log itu

Contoh:

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

Keluaran:

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
Hieu Huynh
sumber