คุณจะตั้งค่าตัวแปร DATE เพื่อใช้ในบันทึกสำหรับเอาต์พุต crontab ได้อย่างไร?


10

ฉันกำลังเล่น aroudn ด้วยการเปลี่ยนแปลงบางอย่างเช่น

DATE = $(date)

แต่นั่นก็ไม่ได้ผลเช่นกัน

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

นี่แค่แสดงผลข้อความตามที่เป็น ...

ฉันต้องการสร้างรายการบันทึกใน crontab.log พร้อมเวลาประทับในการอัพเดทแต่ละครั้ง

ฉันจะทำสิ่งนี้บน CentOS 6 ได้อย่างไร

UPDATE

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

แสดงผลเพียง [CRON] และไม่มีอะไรเมื่อฉันลองมัน = /

คำตอบ:


28

Cron ไม่ใช่เชลล์ - ไม่แยกวิเคราะห์คำสั่งในลักษณะเดียวกับที่เชลล์ทำ ดังนั้นตัวแปรของคุณจะถูกกำหนดเหมือนเป็นข้อความคงที่

มีสามวิธีที่ฉันรู้ถึงปัญหานี้:

ตัวเลือกที่ 1: ใช้เชลล์สคริปต์เพื่อสร้างคำสั่งของคุณรวมถึงตัวแปรและตรรกะอะไรก็ตามที่คุณต้องการ - และเรียกเชลล์สคริปต์นั้นจาก cron

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

ตัวเลือก 2: รวมคำสั่ง date โดยตรงในคำสั่งของคุณและเนื่องจากคำสั่งทั้งหมดถูกส่งผ่านไปยังเชลล์วันที่จะถูกประมวลผลและแทนที่ด้วยวันที่ที่แท้จริง

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

ตัวเลือกที่ 3: ตั้งค่าตัวแปรสตริงใน cron และส่งผ่านไปยังคำสั่งของคุณที่จะประมวลผล (หมายเหตุ - สัญญาณเปอร์เซ็นต์ไม่จำเป็นต้องหลบหนีและตัวแปรตัวเองถูกห่อเป็น $ () เพื่อดำเนินการในเปลือกแยก - Backticks ควรทำงานเหมือนเดิม):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(ในทุกกรณีข้างต้นแน่นอนคุณสามารถใช้ตัวแปรสำหรับเส้นทางการบันทึกแทนการใช้ 'hard coding')


1
ขอบคุณสำหรับข้อเสนอแนะที่ยอดเยี่ยม +1 ฉันพยายามเพิ่มลงใน crontab แต่การทำเช่นนั้นไม่ได้ผล = / มันไม่ทำให้ DATEVAR
qodeninja

ฉันเพิ่งทำสิ่งนี้บนระบบที่เข้ากันได้กับ RHEL / CentOS6 และให้ผลลัพธ์ที่คาดหวัง (เช่นเพิ่มบรรทัดใหม่ในไฟล์พร้อมวันที่) คุณลองใช้ตัวเลือกใด (จาก 3 ข้อข้างต้น) และผลลัพธ์คืออะไรโดยเฉพาะ - และมีข้อผิดพลาดใน / var / log / cron หรือไม่ (ถ้าคุณใช้ตัวเลือกสคริปต์ก) อย่าลืมที่จะ chmod + x และ b) ลองด้วยตัวเองก่อน (เช่นไม่ผ่าน cron))
cyberx86

1
ตัวเลือกที่ 3 =] ฉันพยายามทำมาก่อน แต่มันไม่ได้เรนเดอร์ แต่ตอนนี้ฉันสังเกตเห็นว่าคุณทำสิ่งที่แตกต่าง lil ทำไมคุณเพิ่มเงินเป็นสองเท่า ($ (DATE)) ดูการอัปเดตของฉันด้านบน
qodeninja

1
คุณมีการพิมพ์ผิดในการปรับปรุงที่คุณเพิ่ม - มันเป็นไม่ได้$($DATEVAR) $($(DATEVAR))ลองคิดแบบนี้$()- นั่นคือวงเล็บด้านนอก - เปิดตัวเชลล์ใหม่เพื่อประมวลผลอะไรก็ตามที่อยู่ในวงเล็บ ในกรณีนี้ตัวแปร $ DATEVAR ถูกตั้งค่าเป็นสตริงและส่งผ่านไปยังเชลล์ $(DATEVAR)ไม่มีอะไร - เพราะDATEVARไม่มีอะไร (เช่นขาด $ เพื่อระบุว่าเป็นตัวแปร) คุณสามารถใช้ backticks $DATEVARเพื่อให้ได้ผลลัพธ์เดียวกัน
cyberx86

ยุติธรรมพอสมควร อัปเดตมัน มาลองเด็กเลวคนนี้กันเถอะ! - Hazaaah! มันทำงานได้ lol
qodeninja
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.