ฉันจะเพิ่มรายการใน crontab ของฉันได้อย่างไร


13

ฉันใช้ crontab เป็นครั้งแรก ต้องการเขียนภารกิจ cron สำหรับทดสอบง่ายๆและเรียกใช้งาน

$crontab * * * * * echo "Hi"

ไม่ได้ผลิตอะไรเลย

crontab */1 * * * * echo "hi"

*/1: No such file or directoryกล่าวว่า

นอกจากนี้ฉันจะแสดงรายการงาน cron ที่กำลังทำงานอยู่ได้อย่างไร (ไม่ใช่แค่งานที่ฉันเป็นเจ้าของ แต่งานที่เริ่มโดยผู้ใช้รายอื่นเช่นรูทด้วย)

และฉันจะลบภารกิจ cron เฉพาะได้อย่างไร


สำหรับคำแนะนำเกี่ยวกับวิธีแก้ไขและสร้างงาน cron และคำอธิบายเกี่ยวกับโครงสร้างไฟล์ดูคำแนะนำเกี่ยวกับไวยากรณ์ของ crontab
KJS

คำตอบ:


21

คุณไม่สามารถใช้crontabเช่นนั้น ใช้man crontabเพื่ออ่านเกี่ยวกับวิธีเรียกยูทิลิตี้ที่ถูกต้อง

คุณจะต้องใช้crontab -eเพื่อแก้ไขรายการ cron ของผู้ใช้ปัจจุบัน (คุณสามารถเพิ่ม / แก้ไข / ลบบรรทัด) ใช้crontab -lเพื่อดูรายการงานที่กำหนดค่าปัจจุบัน

สำหรับการดู crontabs ของผู้ใช้คนอื่นมันเป็นไปไม่ได้เลยถ้าไม่รูทในการติดตั้งเริ่มต้น ดูที่ฉันจะแสดงรายการงาน cron ทั้งหมดสำหรับผู้ใช้ทั้งหมดสำหรับวิธีในการแสดงรายการทุกอย่าง (เป็น root)

หมายเหตุ: โปรดระมัดระวังเมื่อคุณใช้อักขระตัวอักษรแบบกลมตัวอักษรบนบรรทัดคำสั่ง ( *และ?โดยเฉพาะอย่างยิ่ง) *จะถูกขยายไปยังรายการไฟล์ในไดเรกทอรีปัจจุบันซึ่งอาจมีผลกระทบที่ไม่คาดคิด หากคุณต้องการส่งผ่าน*ข้อโต้แย้งไปยังสิ่งที่อ้างถึง ( '*')


ดังนั้นฉันทำ crontab -e และใน editor ฉันใส่รายการ * / 1 * * * * echo "hi" และเมื่อฉันบันทึกไฟล์นี้ฉันเห็นข้อความที่ crontab: ติดตั้ง crontab ใหม่ แต่ฉันไม่เห็นข้อความ hi ปรากฏบนหน้าจอ ตอนนี้ฉันกำลังคิดถึงอะไร ขอบคุณ
xyz

2
เอาต์พุตของ crontab จะไม่ไปที่ "หน้าจอ" ของคุณ จาก POSIX man page สำหรับ crontab: "หากเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานไม่ถูกเปลี่ยนทิศทางโดยคำสั่งที่ดำเนินการจากรายการ crontab เอาต์พุตหรือข้อผิดพลาดใด ๆ ที่สร้างขึ้นจะถูกส่งทางไปรษณีย์โดยใช้วิธีการขึ้นอยู่กับการนำไปใช้งาน
Mat

1
ผลลัพธ์ของงานจะถูกส่งไปยังกล่องจดหมายของเจ้าของงาน (วิ่งmailจากบรรทัดคำสั่งควรเข้าถึงกล่องจดหมายของท้องถิ่นหากมีการกำหนดค่า.) หากต้องการดู 'สวัสดี' * * * * * export DISPLAY=:0; xmessage 'hi'ในสภาพแวดล้อมกราฟิกคุณสามารถตั้งค่างานเป็น:
จัดการ

@manatwork นอกจากนี้คุณยังอาจต้องดิสเพลย์ซึ่งอาจจะไม่ง่าย
Derobert

7

มีวิธีแก้ไขสองวิธีcrontab:

  1. แบบโต้ตอบโดยใช้crontab -eซึ่งจะเปิดcrontabในตัวแก้ไขที่ระบุโดย$VISUALหรือ$EDITORหรือ

  2. ไม่ใช่การโต้ตอบโดยใช้crontab crontab.txtซึ่งก็จะนำเข้าcrontabรายการจากไฟล์crontab.txt, เปลี่ยน crontab ใช้งานที่มีอยู่สำหรับผู้ใช้ปัจจุบัน

ปัญหาที่คุณมีคือคุณเพียงแค่ใช้crontabคำสั่งผิด


ข้อกังวลต่อไปนี้เกี่ยวกับการจัดการ crontab แบบไม่โต้ตอบ:

ดังนั้นในการลบงานบางอย่างโดยทางโปรแกรมคุณสามารถทำอะไรได้บ้าง

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

โดยที่PATTERNเป็นนิพจน์ทั่วไปที่จะตรงกับงานที่คุณต้องการลบ ที่นี่จะทำให้คุณปัจจุบันของคุณcrontab -lcrontab

หรือถ้าคุณมีรายการในไฟล์ชื่อcrontab-fragment.txtที่คุณต้องการลบออกจาก crontab ที่ใช้งานอยู่

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

สิ่งนี้จะอ่าน crontab ปัจจุบันและตัวกรอง (ลบ) บรรทัดใด ๆ ที่เกิดขึ้นในไฟล์crontab-fragment.txtในไดเรกทอรีปัจจุบัน (ใช้การเปรียบเทียบสตริงของบรรทัดทั้งหมด) ผลลัพธ์จะถูกบันทึกcrontab.txtและโหลดจากที่นั่นเพื่อแทนที่ crontab ปัจจุบัน

หากต้องการเพิ่มหนึ่งหรือหลายภารกิจให้ทำดังนี้

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

นี่คือการสมมติว่าไฟล์crontab-fragment.txtมีรายการที่คุณต้องการเพิ่ม มันอ่าน crontab ปัจจุบันผนวกรายการจากนี้และสร้างcrontab-fragment.txt ไฟล์แล้วแทนที่ crontab ปัจจุบันcrontab.txtcrontab.txt


2

หากคุณต้องการแก้ไข crontab แบบโต้ตอบให้รันคำสั่งcrontab -eโดยไม่มีตัวเลือกอื่น สิ่งนี้จะเริ่มแก้ไขบนสำเนาของ crontab; เมื่อคุณออกจากตัวแก้ไขสำเนาที่แก้ไขจะกลายเป็น crontab ใหม่ คุณสามารถควบคุมการแก้ไขจะเริ่มต้นผ่านVISUALและEDITORตัวแปรสภาพแวดล้อม เพื่อแสดงรายการ crontab crontab -lของคุณวิ่ง

หากคุณต้องการแก้ไข crontab ในสคริปต์ให้ตั้งค่าVISUALและEDITORไปที่พา ธ ไปยังสคริปต์หรือไปยังข้อมูลโค้ดของเชลล์ที่แก้ไขไฟล์ที่ให้มา ตัวแก้ไขedเป็นไปได้ที่นี่หรือsed -iหากการนำไปใช้ของคุณsedมีตัวเลือกนี้ echo … >>หากคุณต้องการโดยไม่มีเงื่อนไขเพิ่มบรรทัดคุณสามารถใช้ ดูแลด้วยข้อความ EDITORถ้าทุกข้อสงสัยเขียนสคริปต์และผ่านชื่อของสคริปต์เป็น

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF

2

นี่มันช้าไปหน่อย แต่สำหรับคนอื่นที่มาที่นี่ มีวิธีที่ง่ายกว่าการจัดการกับการป้อนข้อมูลที่มี / เอาต์พุตลำธารด้วยและVISUALEDITOR

คุณสามารถเขียนกำหนดการ cron ของคุณในไฟล์ 1 งานต่อบรรทัดและใช้คำสั่งcrontab [filename]เพื่อให้catงานของคุณfilenameเป็นส่วนหนึ่งของสคริปต์ของคุณจากนั้นจึงเรียก crontab ท้ายที่สุดหากคุณต้องการ

ในความเป็นจริงนี่คือการใช้งานที่พบบ่อยที่สุดเป็นman crontabคำแนะนำโดยรายการแรก


2

หากคุณต้องการเพิ่มรายการในcrontabระบบอัตโนมัติหรือจากบรรทัดคำสั่งคุณสามารถทำได้ (ตั้งค่าเวลาที่คุณต้องการ)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

แล้ว:

service crond reload

เพื่อโหลด crontabs


เรื่องนี้ไม่สามารถแปลได้ ไม่ได้ทั้งหมดยูนิกซ์เก็บไฟล์ crontab /var/spool/cronภายใต้ วิธีที่ดีกว่าคือการผ่านcrontab(1)คำสั่ง
thrig

นั่นอาจเป็นจริง แต่เป็นการแสดงให้เห็นถึงหลักการของวิธีที่คุณสามารถทำได้บนระบบและใช่ crontab ทำเคล็ดลับถ้าคุณต้องการเพิ่มทีละบรรทัด มันไม่ได้หมายความว่าจะเป็นคำตอบที่แน่นอน แต่อย่างหนึ่งถ้าคุณรู้ว่าข้อมูลของคุณอยู่ที่ไหนและคุณต้องเพิ่มจำนวนมาก ใช้เพื่อสิ่งที่มันเป็น
Chris Sprucefield

1

ลองด้วยคำสั่งนี้:

crontab -e 

จากนั้นเพิ่มงาน cron ของคุณ:

*/1 * * * * echo "hi"

ในไฟล์นั้น


0

ฉันต้องการเน้นวิธีที่ฉันอธิบายด้านล่างแม้ว่าจะได้รับการกล่าวถึงก่อนหน้าในความคิดเห็นอื่น ฉันพบว่ามันมีประโยชน์มากเมื่อเพิ่มรายการลงในไฟล์และเพิ่มไฟล์ไปยัง crontab hello-world-crontab.txtไฟล์ที่จะมีสองรายการด้านล่างและชื่อไฟล์จะเป็น

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

จากนั้นฉันดำเนินการคำสั่งด้านล่างเพื่อเพิ่มรายการเหล่านี้ไปยัง crontab

  • $ crontab hello-world-crontab.txt

ขั้นตอนต่อไปคือการตรวจสอบว่ามีการเพิ่มรายการเหล่านี้

  • $ crontab -l

คำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่แต่ละรายการทำ:

  • รายการ crontab นี้เขียนว่า "Hello world!" ลงในไฟล์/home/user/greeting.txtทุกวันเวลา 9.00 น.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • crontab นี้ประมวลผลไฟล์ไพ ธ อนซึ่งพิมพ์ในบรรทัดคำสั่ง 'Hello world!' ทุกวันเวลา 9.00 น.
    • 0 09 * * * python /home/user/greeting.py
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.