ฉันต้องเพิ่มงาน cron ผ่านสคริปต์ที่ฉันเรียกใช้เพื่อตั้งค่าเซิร์ฟเวอร์ ฉันกำลังใช้ Ubuntu ฉันสามารถใช้crontab -e
แต่จะเปิดตัวแก้ไขเพื่อแก้ไข crontab ปัจจุบัน ฉันต้องการทำสิ่งนี้โดยทางโปรแกรม
เป็นไปได้ที่จะทำเช่นนั้น?
ฉันต้องเพิ่มงาน cron ผ่านสคริปต์ที่ฉันเรียกใช้เพื่อตั้งค่าเซิร์ฟเวอร์ ฉันกำลังใช้ Ubuntu ฉันสามารถใช้crontab -e
แต่จะเปิดตัวแก้ไขเพื่อแก้ไข crontab ปัจจุบัน ฉันต้องการทำสิ่งนี้โดยทางโปรแกรม
เป็นไปได้ที่จะทำเช่นนั้น?
คำตอบ:
งาน Cron มักจะถูกเก็บไว้ในไฟล์ต่อผู้ใช้ภายใต้ /var/spool/cron
สิ่งที่ง่ายที่สุดสำหรับคุณคือการสร้างไฟล์ข้อความด้วยงานที่กำหนดค่าจากนั้นคัดลอกไปยังโฟลเดอร์ cron spool และตรวจสอบให้แน่ใจว่ามีสิทธิ์ที่ถูกต้อง (600)
ต่อไปนี้เป็นหนึ่งในสายการบินที่ไม่ได้ใช้ / ต้องการงานใหม่ให้อยู่ในไฟล์:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
2>/dev/null
จึงเป็นสิ่งสำคัญที่คุณไม่ได้รับno crontab for username
ข้อความว่าบาง nixes * ผลิตถ้ามีอยู่ในขณะนี้ไม่มีรายการ crontab
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
หวังว่านี่จะช่วยให้ใครบางคน
สำหรับผู้ใช้ crontabs (รวมถึงรูท) คุณสามารถทำสิ่งต่อไปนี้:
crontab -l -u user | cat - filename | crontab -u user -
โดยที่ไฟล์ชื่อ "filename" มีรายการที่จะต่อท้าย นอกจากนี้คุณยังสามารถทำจัดการข้อความที่ใช้หรือเครื่องมืออื่นในสถานที่ของsed
cat
คุณควรใช้crontab
คำสั่งแทนการแก้ไขไฟล์โดยตรง
การดำเนินการที่คล้ายกันจะเป็น:
{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -
หากคุณกำลังแก้ไขหรือสร้าง crontabs ระบบสิ่งเหล่านั้นอาจได้รับการจัดการเช่นเดียวกับไฟล์ข้อความธรรมดา พวกเขาจะถูกเก็บไว้ใน/etc/cron.d
, /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
, /etc/cron.monthly
ไดเรกทอรีและไฟล์และ/etc/crontab
/etc/anacrontab
echo
) ฉันได้รับ "crontab: การใช้ผิดพลาด: ต้องระบุชื่อไฟล์เพื่อแทนที่" หน้าคน Cron แสดงไวยากรณ์เป็นcrontab [ -u user ] file
นั่นคือด้วยชื่อไฟล์บังคับ มีเคล็ดลับที่จะทำให้การยอมรับข้อมูล piped หรือไม่?
stdin
ในท่อยัติภังค์จะต้องใช้เพื่อแสดงให้เห็นว่าการป้อนข้อมูลจาก ฉันจะแก้ไขคำตอบของฉัน
ใน Ubuntu และ distros อื่น ๆ คุณสามารถใส่ไฟล์ลงใน/etc/cron.d
ไดเรกทอรีที่มีบรรทัดเดียวพร้อมกับรายการcrontab ที่ถูกต้อง ไม่จำเป็นต้องเพิ่มบรรทัดลงในไฟล์ที่มีอยู่
/etc/cron.daily
หากคุณเพียงแค่ต้องการสิ่งที่จะทำงานทุกวันเพียงแค่ใส่ไฟล์ลงใน ในทำนองเดียวกันคุณยังสามารถวางไฟล์ลง/etc/cron.hourly
, และ/etc/cron.monthly
/etc/cron.weekly
คำตอบที่ง่ายยิ่งขึ้นสำหรับคำถามของคุณคือ:
echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root
คุณสามารถตั้งค่า cronjobs บนเซิร์ฟเวอร์ระยะไกลได้ดังนี้:
#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
do
echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done
ใน Linux ที่ตั้งเริ่มต้นของไฟล์crontab
/var/spool/cron/
ที่นี่คุณสามารถค้นหาcrontab
ไฟล์ของผู้ใช้ทั้งหมด คุณเพียงแค่เพิ่มรายการ cronjob ของคุณต่อท้ายไฟล์ของผู้ใช้นั้น ๆ ในตัวอย่างด้านบนไฟล์ crontab ของผู้ใช้รูทจะถูกต่อท้ายด้วย cronjob เพื่อรัน/root/test.sh
ทุกวันเวลา 1:00 น
/var/spool/cron/crontabs/root
บน Ubuntu
ไฟล์ Crontab เป็นเพียงไฟล์ข้อความและสามารถจัดการได้เหมือนกับไฟล์ข้อความอื่น ๆ วัตถุประสงค์ของcrontab
คำสั่งคือการทำให้การแก้ไขไฟล์ crontab ปลอดภัยยิ่งขึ้น เมื่อแก้ไขผ่านคำสั่งนี้ไฟล์จะถูกตรวจสอบหาข้อผิดพลาดและบันทึกเฉพาะในกรณีที่ไม่มี
crontab [path to file]
สามารถใช้เพื่อระบุ crontab ที่เก็บไว้ในไฟล์ เช่นcrontab -e
นี้จะติดตั้งไฟล์หากไม่มีข้อผิดพลาด
ดังนั้นสคริปต์สามารถเขียนไฟล์แท็บ cron โดยตรงหรือเขียนลงในไฟล์ชั่วคราวและโหลดด้วยcrontab [path to temp file]
คำสั่ง การบันทึกโดยตรงจะช่วยให้คุณไม่ต้องเขียนไฟล์ชั่วคราว แต่ก็หลีกเลี่ยงการตรวจสอบความปลอดภัย
crontab [path to file]
.. นี่เป็นตัวเลือกที่ดีที่สุดสำหรับฉันเพราะมันช่วยให้อ่านรหัสได้ง่ายขึ้น ฉันใช้ crontab เพื่อติดตามพัสดุและเปลี่ยนภาพพื้นหลังเดสก์ทอปของฉันด้วยสถานะ เมื่อฉันไม่ได้คาดหวังพัสดุมันไม่จำเป็นต้องตรวจสอบทุกชั่วโมง นั่นเป็นเหตุผลที่ฉันต้องการให้สคริปต์แก้ไขความถี่ cron โดยอัตโนมัติ
(ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นดังนั้นฉันจึงเพิ่มเป็นคำตอบ: อย่าลังเลที่จะเพิ่มเป็นความคิดเห็นถัดจากคำตอบของเขา)
หนึ่งซับในของ Joe Casadonteนั้นสมบูรณ์แบบยกเว้นถ้าคุณทำงานด้วยset -e
เช่นถ้าสคริปต์ของคุณถูกตั้งค่าให้ล้มเหลวเนื่องจากข้อผิดพลาดและถ้าไม่มี cronjobs ในกรณีนั้นหนึ่งซับจะไม่สร้าง cronjob แต่จะไม่หยุดสคริปต์ ความล้มเหลวเงียบสามารถทำให้เข้าใจผิดมาก
เหตุผลก็คือcrontab -l
ส่งคืนพร้อม1
รหัสส่งคืนทำให้คำสั่งที่ตามมา ( echo
ไม่) ถูกเรียกใช้ ... ดังนั้นจึงไม่สร้าง cronjob แต่เนื่องจากพวกเขาจะถูกดำเนินการเป็น subprocess (เพราะวงเล็บ) พวกเขาจะไม่หยุดสคริปต์
(ที่น่าสนใจถ้าคุณเรียกใช้คำสั่งเดียวกันอีกครั้งมันจะทำงาน: เมื่อคุณดำเนินการcrontab -
ครั้งเดียวcrontab -l
ก็ยังไม่มีอะไรออก แต่มันจะไม่กลับข้อผิดพลาดอีกต่อไป (คุณไม่ได้รับno crontab for <user>
ข้อความอีกต่อไป) ดังนั้นต่อมาecho
ดำเนินการ และ crontab ถูกสร้างขึ้น)
ไม่ว่าในกรณีใด ๆ หากคุณใช้set -e
งานสายจะต้อง:
(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
เป็นการแก้ไขข้อเสนอแนะcrontab -l | crontab -
: สิ่งนี้ไม่สามารถใช้ได้กับทุกระบบ ตัวอย่างเช่นฉันต้องเพิ่มงานในรูท crontab บนเซิร์ฟเวอร์หลายสิบเครื่องที่ใช้ SUSE เวอร์ชันเก่า (อย่าถามว่าทำไม) SUSEs เก่าเติมบรรทัดความคิดเห็นไปยังผลลัพธ์ของcrontab -l
การทำที่crontab -l | crontab -
ไม่ใช่ idempotent (Debian ตระหนักถึงปัญหานี้ใน manpage crontab และแก้ไขเวอร์ชัน Vixie Cron เพื่อแก้ไขพฤติกรรมเริ่มต้นของcrontab -l
)
หากต้องการแก้ไข crontabs โดยทางโปรแกรมในระบบที่crontab -l
เพิ่มความคิดเห็นคุณสามารถลองทำสิ่งต่อไปนี้:
EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
บอกให้ crontab ใช้cat
เป็นตัวแก้ไข (ไม่ใช่ค่าปริยายปกติ vi) ซึ่งไม่เปลี่ยนไฟล์ แต่คัดลอกไปที่ stdout แทน สิ่งนี้อาจยังคงล้มเหลวหากcrontab -
คาดว่าอินพุตในรูปแบบแตกต่างจากcrontab -e
เอาต์พุตใด อย่าพยายามแทนที่รอบสุดท้ายcrontab -
ด้วยcrontab -e
- มันจะไม่ทำงาน
ดี/etc/crontab
เพียงไฟล์ ASCII เพื่อให้ง่ายที่สุดคือการเพียง
echo "*/15 * * * * root date" >> /etc/crontab
ซึ่งจะเพิ่มงานซึ่งจะส่งอีเมลถึงคุณทุก 15 นาที ปรับแต่งเพื่อลิ้มรสและทดสอบผ่านทางgrep
หรือวิธีการอื่น ๆ ไม่ว่าจะเพิ่มบรรทัดนั้นเพื่อให้ idempotent ของสคริปต์ของคุณ
บน Ubuntu et al, คุณยังสามารถวางไฟล์ใน/etc/cron.*
ซึ่งเป็นที่ง่ายต่อการทำและการทดสอบหา --- รวมทั้งคุณจะไม่ยุ่งกับ (ระบบ) ไฟล์ config /etc/crontab
เช่น
crond
จะตรวจสอบและแน่นอนมันจะทำบนแพลตฟอร์มที่ระบุไว้ของ OP
นี่คือวิธีการแก้ไข cron รายการโดยไม่ต้องแก้ไขไฟล์ cron โดยตรง (ซึ่งขมวดคิ้วอยู่)
crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -
หากคุณต้องการลบรายการ cron ให้ใช้สิ่งนี้:
crontab -l -u <user> | sed '/find/d' | crontab -u <user> -
ฉันรู้ว่านี่ไม่ใช่สิ่งที่ gaurav ร้องขอ แต่ทำไมไม่มีโซลูชั่นทั้งหมดในที่เดียว
ฉันได้เขียนเครื่องมือการปรับใช้ crontab ใน python: https://github.com/monklof/deploycron
pip install deploycron
ติดตั้ง crontab ของคุณง่ายมากซึ่งจะรวม crontab เข้ากับ crontab ที่มีอยู่ของระบบ
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
มันเป็นวิธีการเพิ่มงาน cron เพิ่ม:
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"