ฉันจะเรียกใช้งาน 'date' ภายในงาน cron tab ได้อย่างไร?


117

ฉันต้องการสร้างไฟล์บันทึกสำหรับสคริปต์ cron ที่มีชั่วโมงปัจจุบันในชื่อไฟล์บันทึก นี่คือคำสั่งที่ฉันพยายามใช้:

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

น่าเสียดายที่ฉันได้รับข้อความนี้เมื่อทำงาน:

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

ฉันพยายามหนีdateส่วนต่างๆด้วยวิธีต่าง ๆ แต่ไม่มีโชคมาก เป็นไปได้ไหมที่จะทำให้สิ่งนี้เกิดขึ้นแบบอินไลน์ในไฟล์ crontab หรือฉันจำเป็นต้องสร้างเชลล์สคริปต์เพื่อทำสิ่งนี้?

คำตอบ:


180

คำตอบสั้น ๆ :

หลบหนีจาก%เป็น\%:

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

คำตอบยาว:

ข้อความแสดงข้อผิดพลาดแสดงให้เห็นว่าเชลล์ที่ดำเนินการคำสั่งของคุณไม่เห็นอักขระขีดหลังที่สอง:

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

นี่ยังได้รับการยืนยันโดยข้อความแสดงข้อผิดพลาดที่คุณได้รับเมื่อคุณลองคำตอบอย่างใดอย่างหนึ่ง:

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

manpage crontabยืนยันว่าคำสั่งจะถูกอ่านเท่านั้นขึ้นไปที่ไม่ใช้ Escape แรก%เข้าสู่ระบบ:

ฟิลด์ "six" (ส่วนที่เหลือของบรรทัด) ระบุคำสั่งที่จะรัน ส่วนคำสั่งทั้งหมดของบรรทัดจนถึงบรรทัดใหม่หรือ %อักขระจะถูกดำเนินการโดย/bin/shหรือโดยเชลล์ที่ระบุในSHELLตัวแปรของ cronfile Percent-signs ( %) ใน คำสั่งยกเว้นยกเว้น Escape ด้วย backslash ( \) จะถูกเปลี่ยนเป็น อักขระขึ้นบรรทัดใหม่และข้อมูลทั้งหมดหลังจาก%คำสั่งแรกจะถูกส่งไปยังคำสั่งเป็นอินพุตมาตรฐาน


ขออภัยที่ฉันไม่รู้ แต่คุณเห็นข้อความแสดงข้อผิดพลาดนี้ที่ไหน เมื่อฉันทำ 'grep CRON / var / log / syslog' ฉันไม่เห็นข้อความแสดงข้อผิดพลาดแม้ว่า cron จะล้มเหลว - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@ Копать_Шо_я_нашел cron จะส่งอีเมลพร้อมข้อความแสดงข้อผิดพลาด
Jasen

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

7

คุณยังสามารถใส่คำสั่งลงในไฟล์เชลล์จากนั้นเรียกใช้ไฟล์เชลล์ด้วย cron

jobs.sh

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

cron

0 * * * * sh jobs.sh

6

หากคุณต้องการสร้างสตริงการจัดรูปแบบวันที่เป็นตัวแปร (เพื่อหลีกเลี่ยงการทำซ้ำสตริงทั้งหมด) อย่าหนี%และอย่าใส่ไว้ใน$()

ตัวอย่างเช่นในขณะที่ประกาศสตริงเพียงแค่เขียน:

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

จากนั้นเขียนคำสั่ง cron ด้วย$($VARIABLE_NAME)สิ่งนี้:

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

ขอขอบคุณที่cyberx86 , เธอ / คำตอบของเขาที่ServerFaultอาจจะแล้วเสร็จเพิ่มเติมได้ที่:


1
DATEVAR = "วันที่ +% Y% m% d_% H% M% S"
Frank Fang

3

ใน cron คุณสามารถใช้ไวยากรณ์ง่าย ๆ นี้:

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

รูปแบบวันที่แสดงผลจะเรียกใช้ซ้ำเช่น cron_20180123.log
bala4rtraining

(1) คุณกำลังพูดอะไรที่ยังไม่ได้ตอบโดยคำตอบที่ยอมรับ? (2) คำตอบของคุณซับซ้อนกว่าคำถามมาก ตัวอย่างเช่นคุณเพิ่ม-dตัวเลือกซึ่งไม่ได้ใช้ในคำถาม (และคุณไม่ได้อธิบาย) คุณให้เหตุผลว่าการเรียก "ไวยากรณ์ง่าย" นี้ได้อย่างไร
G-Man

2

คำตอบทั้งหมดข้างต้นใช้เครื่องหมายคำพูดคู่ (ไม่ใช่ทั้งหมดสำหรับการตั้งค่าของฉัน) สิ่งนี้ใช้ได้กับฉัน:

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

1
คุณกำลังบอกว่ายังไม่ได้รับคำตอบที่ยอมรับ คุณกำลังบอกว่ามันทำงานได้ดีขึ้นโดยไม่ต้องมีคำพูดกว่ามันจะมีคำพูด? (คำแนะนำ: มันไม่น่าเป็นไปได้มาก)
G-Man

คำตอบที่ยอมรับนั้นใช้ไม่ได้สำหรับฉัน อันนี้ทำ
Manuel Schmitzberger

0

ทางออกพื้นฐาน:

  • ใช้$()สำหรับรันdateคำสั่งและส่งคืนเอาต์พุต
  • รูปแบบวันที่และเวลาไปยัง UTC หลีกเลี่ยง%ตัวละครด้วย\
  • เพิ่ม2>&1ในตอนท้ายสำหรับการสตรีมทั้งสองstdoutและstderrลงในไฟล์บันทึกนั้น

ตัวอย่าง:

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

เอาท์พุท:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.