วิธีการเปลี่ยนเส้นทางการส่งออกไปยังไฟล์จากภายใน cron?


105

ฉันมีสคริปต์การสำรองข้อมูลที่ฉันจำเป็นต้องใช้ในเวลาใดเวลาของวันเพื่อให้ฉันใช้cronสำหรับงานนี้และจากภายใน cron logfileกำลังยังพยายามที่จะเปลี่ยนเส้นทางการส่งออกของสคริปต์การสำรองข้อมูลไปยัง

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

ในรายการ cron ด้านบนฉันกำลังเปลี่ยนเส้นทางทั้งสองstderr and stdoutไปยังไฟล์บันทึก

งาน cron ด้านบนดำเนินการได้ดีตามsyslog และทำงานที่กล่าวถึงในbackup.shไฟล์ แต่ไม่ได้เขียนอะไรลงในไฟล์บันทึก

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

เมื่อฉันเรียกใช้สคริปต์จาก cli มันทำงานได้ตามต้องการและเอาท์พุทจะถูกเขียนลงในล็อกไฟล์

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

ดังนั้นทำไมเอาต์พุตของไฟล์ไม่ได้รับการเปลี่ยนเส้นทางไปยังไฟล์จากภายใน cron


คำตอบ:


158

ฉันแก้ไขปัญหา มีสองวิธี:

M1

เปลี่ยนการเปลี่ยนเส้นทางจากไป&>> 2>&1ดังนั้นตอนนี้crontab -eดูเหมือนว่า

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

ผมเชื่อว่าการทำงานข้างต้นเพราะโดยปกติcronจะใช้shในการเรียกใช้งานแทนbashจึงไม่ได้รับการสนับสนุนโดย&>>sh

M2

เปลี่ยนเชลล์เริ่มต้นโดยการเพิ่มSHELL=/bin/bashในcrontab -eไฟล์


14
cronเป็นเหมือนsh: มันไม่ได้เลือกโปรแกรมเดียว มีการนำไปใช้งานหลายอย่าง การใช้งานที่แพร่หลายที่สุดคือ Vixie cron ฉันเป็นผู้เขียนคนอื่น (ปัจจุบันไม่ใช่ต้นฉบับ) ผมเชื่อว่าส่วนใหญ่ภูต cron จะใช้ระบบแต่ที่แตกต่างกันในไม่ว่าจะยอมรับsh &>>cron daemons บางตัว (เหมือนของฉัน) ไม่อนุญาตให้คุณเปลี่ยนเชลล์ที่จะประมวลผลบรรทัด cron ด้วยSHELL=...บรรทัดใน crontab ฉันดีใจที่คุณพบวิธีแก้ปัญหาที่เหมาะกับคุณ แค่คิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่ามีตัวแปรมากมายที่อาจส่งผลกระทบต่อการทำงานของผู้อื่น
dubiousjim

วิธีแทรกYYYY-MM-DD_hh-mm-secลงในชื่อไฟล์เอาต์พุตเพื่อให้ทุกชื่อไฟล์แตกต่างกันและเก็บไว้โดยไม่ต้องเขียนใหม่?
Danijel

1
@Danijel: สิ่งนี้จะช่วยserverfault.com/questions/117360/…
RanRag

2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logทำสิ่งเดียวกันด้วย
Yanick Girouard

5

ข้อจำกัดความรับผิดชอบ [1]

ผมอยากจะเพิ่มเชิงอรรถหรือการเพิ่มเติม@ RanRag ของคำตอบ

ตรวจสอบให้แน่ใจว่าไวยากรณ์การเปลี่ยนเส้นทางเชลล์ของคุณเป็นไป/bin/shตาม หากคุณพยายามใช้ไวยากรณ์การเปลี่ยนเส้นทางเชลล์ที่ไม่ถูกต้อง/bin/shคำสั่งของคุณจะล้มเหลวและงาน cron ของคุณจะไม่ทำงาน

ใน/etc/cron.d/example1ไฟล์กำหนดค่าของคุณหากคุณระบุผู้ใช้อื่นที่ไม่ใช่rootและเชลล์ล็อกอินของผู้ใช้นั้นไม่ใช่/bin/bash... คุณต้องใช้ไวยากรณ์ / bin / sh ใน/etc/cron.d/example1คำสั่ง


ตัวอย่างเช่น

หากผู้ใช้ของคุณมีเปลือกcshหรือzshหรือkshตั้งค่าสำหรับเปลือกเข้าสู่ระบบของเขา ใน/etc/cron.d/example1ไฟล์ปรับแต่งของคุณคำสั่งจะต้องใช้/bin/shไวยากรณ์ การเปลี่ยนเส้นทางเชลล์ใด ๆ จะต้องเป็น/bin/shรูปแบบเฉพาะ

หากคุณพยายามใช้ตัวอย่างเช่นการcshเปลี่ยนเส้นทางเชลล์เชลล์ใน/etc/cron.d/example1งาน cron ของคุณจะไม่ทำงาน logfile สำหรับcrondตั้งอยู่ที่/var/log/cronจะบอกว่าคำสั่งจะทำงาน แต่คำสั่งจะผิดพลาดด้วยข้อผิดพลาดทางไวยากรณ์ก่อนที่คำสั่งของคุณจะได้รับการเรียกใช้

สถานที่ที่ไม่crondปล่อยข้อความผิดพลาดสำหรับข้อผิดพลาดทางไวยากรณ์?

ข้อผิดพลาดไม่เคยถูกรายงาน/var/log/cronมา crondแทนโดยค่าเริ่มต้นส่งเสียงข้อความผิดพลาดใด ๆ mailที่ใช้ ดังนั้นคุณต้องตรวจสอบ/var/spool/mail/${USER}เพื่อดูว่ามีข้อผิดพลาดอะไร

[1]

คำปฏิเสธ

  • คำตอบนี้ถือว่าเป็นsysvระบบ
  • systemd ข้อมูลอาจแตกต่างกัน
  • โดยเฉพาะข้อมูลนี้ได้รับการเรียนรู้สำหรับcentos-6distro และอาจไม่นำไปใช้กับsysvdistros ที่ แตกต่างกัน
    • ฉันพูดถึงcentos-6เฉพาะเพราะ distros ที่แตกต่างกันอาจมีการcrondใช้งานที่แตกต่างจากcentos-6

2
หากคุณต้องการให้/etc/cron.d/example1คำสั่งของคุณใช้เชลล์อื่นคุณสามารถใช้ set SHELL=ใน/etc/cron.d/example1ไฟล์ปรับแต่งของคุณ
เทรเวอร์บอยด์สมิ ธ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.