Score:3

การตั้งเวลางานเบื้องหน้าใน Linux คล้ายกับ Task Scheduler ของ Windows

ธง cn

ฉันมีแอปพลิเคชันแบบแบตช์บน Windows ที่ฉันเรียกใช้ทุกวันตอนเที่ยงคืน เมื่อเร็ว ๆ นี้ ฉันแปลงสิ่งนี้เป็นเชลล์สคริปต์ของ Linux บนเครื่อง Linux และต้องการเรียกใช้ในทำนองเดียวกันทุกวันตอนเที่ยงคืน ข้อกำหนดของฉันมีดังนี้:-

  • เพื่อให้เชลล์สคริปต์ทำงานเบื้องหน้า - เพื่อให้ฉันเห็นผลลัพธ์ของกระบวนการทำงานและแก้ไข/แก้ไขสิ่งต่างๆ หากล้มเหลว
  • เช่นเดียวกับการทำงานของตัวกำหนดเวลางานของ Windows ฉันต้องการมีรายการสคริปต์ที่ฉันสามารถเรียกใช้ได้ และรายการเหล่านั้นสามารถเปิด/ปิดได้
  • (ไม่บังคับ) ตามหลักการแล้ว ตัวกำหนดเวลางานสามารถแก้ไขได้ด้วยโปรแกรม สิ่งนี้จะช่วยให้ฉันปิด/เปิดใช้งานงานตามผลลัพธ์ของงานที่รันไปแล้ว

สิ่งนี้ทำได้? ฉันเห็นลิงก์ด้านล่างแล้ว แต่ไม่มีเกณฑ์ทั้งหมดที่ฉันต้องการสำหรับกรณีการใช้งานของฉัน หากลิงก์ใดลิงก์หนึ่งด้านล่างเป็นวิธีที่ถูกต้อง ตัวอย่างอาจมีประโยชน์มาก

mchid avatar
bo flag
คุณช่วยอธิบายได้ไหมว่าทำไมพวกเขาถึงไม่เป็นไปตามเกณฑ์ของคุณ กรุณาเจาะจง มิฉะนั้น เราจะคาดเดาบางสิ่งที่คุณได้พิจารณาแล้วและอาจทำให้เสียเวลา ขอบคุณ.
mchid avatar
bo flag
BTW [เพื่อเรียกใช้งาน cron ตอนเที่ยงคืน](https://crontab.guru/every-night-at-midnight) คุณต้องนำหน้าคำสั่งหรือเส้นทางไปยังสคริปต์ด้วย `0 0 * * *` ตัวอย่างเช่น ในการเรียกใช้ `/home/youssif/myscript` คุณจะต้องใช้ `0 0 * * /home/youssif/myscript` ในไฟล์ crontab ของคุณ หากต้องการแก้ไขไฟล์ crontab ให้ใช้ `crontab -e` เพื่อเรียกใช้คำสั่งในฐานะผู้ใช้ปัจจุบันของคุณ อีกทางหนึ่ง หากคุณต้องการรันคำสั่งในฐานะรูทจริงๆ คุณสามารถเรียกใช้ `sudo crontab -e` เพื่อแก้ไขไฟล์ crontab ของคุณได้
mchid avatar
bo flag
นาทีเท่ากับ 0 ชั่วโมงเท่ากับ 0 ทุกวันของเดือน = * ทุกเดือน = * ทุกวันในสัปดาห์ = *
Zanna avatar
kr flag
นี่ค่อนข้างกว้างสำหรับไซต์ของเรา อาจช่วยได้ถ้าคุณอธิบายว่าสคริปต์ของคุณทำอะไรหรือแบ่งปันในคำถาม ตามหลักการแล้ว ฉันขอแนะนำให้คุณลองดูและระบุปัญหาที่คุณพบ เพื่อให้คุณสามารถถามคำถามที่เฉพาะเจาะจงมากขึ้นได้
Score:8
ธง bo

เพื่อเรียกใช้งาน cron ตอนเที่ยงคืนคุณจะนำหน้าคำสั่งหรือเส้นทางไปยังสคริปต์ของคุณด้วย:

0 0 * * *

ตัวอย่างเช่นในการเรียกใช้ /home/youssif/myscript คุณจะใช้:

0 0 * * /home/youssif/myscript

ในไฟล์ crontab ของคุณ


เพื่อแก้ไขไฟล์ crontab ของคุณ, ใช้ crontab -e เพื่อเรียกใช้คำสั่งในฐานะผู้ใช้ปัจจุบันของคุณ อีกทางหนึ่ง หากคุณต้องการเรียกใช้คำสั่งในฐานะรูท คุณสามารถเรียกใช้ได้ sudo crontab -e เพื่อแก้ไขไฟล์ crontab ของคุณ


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

จอแสดงผล=:0

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

ดังนั้นเพื่อเรียกใช้ เสียงสะท้อน "สวัสดีชาวโลก" ในอาคารผู้โดยสารตอนเที่ยงคืน คำสั่งของคุณจะมีลักษณะดังนี้:

0 0 * * DISPLAY=:0 xterm -hold -e 'echo "hello world"'

หรือเรียกใช้สคริปต์ของคุณ:

0 0 * * DISPLAY=:0 xterm -hold -e '/home/youssif/myscript'

อย่างไรก็ตาม วิธีมาตรฐานในการตรวจสอบเอาต์พุตของ cronjob คือเปลี่ยนเส้นทางเอาต์พุตเทอร์มินัลไปยังไฟล์ซึ่งคุณสามารถดูได้ในภายหลัง

ตัวอย่างเช่น เพื่อเปลี่ยนทิศทางเอาต์พุตของเทอร์มินัลไปยังไฟล์ /home/youssif/helloworld.log คุณจะใช้บรรทัดต่อไปนี้ในไฟล์ crontab ของคุณ:

0 0 * * echo "สวัสดีชาวโลก" > /home/youssif/helloworld.log

หรือคุณยังสามารถใช้ ที คำสั่งเพื่อเปลี่ยนเส้นทางเอาต์พุตดังนี้:

0 0 * * echo "สวัสดีชาวโลก" | ที /home/youssif/helloworld.log

ในที่สุดคุณสามารถใช้ แมว คำสั่งเพื่อดูเนื้อหาของไฟล์:

แมว /home/youssif/helloworld.log

ด้วยวิธีนี้ คำสั่งสามารถทำงานในพื้นหลัง แต่คุณยังคงสามารถตรวจสอบเอาต์พุตได้


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


แก้ไข:

เนื่องจาก @Tcooper ชี้ให้เห็นเราต้องเพิ่ม 2>&1 เพื่อเปลี่ยนเส้นทางเอาต์พุตทั้งหมด รวมถึงข้อความแสดงข้อผิดพลาด ดังนั้นคุณอาจต้องการใช้สิ่งนี้แทน:

0 0 * * echo "สวัสดีชาวโลก" 2>&1 > /home/youssif/helloworld.log

หรือ

0 0 * * echo "สวัสดีชาวโลก" 2>&1 | ที /home/youssif/helloworld.log
mchid avatar
bo flag
อย่างไรก็ตาม ฉันคิดว่ามันน่าจะเป็น **ไม่ใช่ความคิดที่ดีที่จะเรียกใช้ crontab ในเทอร์มินัลในฐานะรูท ซึ่งอาจส่งผลให้ไฟล์ Xauthority ของคุณสูญเสียการอนุญาตที่ถูกต้อง** นี่อาจไม่ใช่ปัญหากับ Wayland แต่ฉันไม่แน่ใจ นั่นเป็นหนึ่งในหลายๆ เหตุผลที่ดีที่สุดที่จะเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์
Youssif Saeed avatar
cn flag
ขอบคุณสำหรับการตอบกลับโดยละเอียดของคุณ ฉันได้ทดสอบแล้วและใช้งานได้สำหรับฉัน นี่คือสิ่งที่ฉันต้องการในการเริ่มต้น
TCooper avatar
cn flag
อาจคุ้มค่าที่จะกล่าวถึงหากคุณต้องการให้เอาต์พุตทั้งหมดไปที่ไฟล์บันทึกของคุณ และไม่มีที่อื่น ให้เพิ่ม "2>&1" โดยที่ 2 คือเอาต์พุตข้อผิดพลาดมาตรฐาน และ 1 คือเอาต์พุตมาตรฐาน ดังนั้นส่งข้อผิดพลาดไปยังเอาต์พุตมาตรฐานและส่งออกทั้งหมดไปยังไฟล์บันทึกของคุณ หรืออีกทางหนึ่งคือไฟล์บันทึกที่แตกต่างกันสองไฟล์: "2>err_log.txt 1>cron_log.txt" - ไม่ประกาศค่าเริ่มต้นนี้ให้กับอีเมลระบบสำหรับข้อผิดพลาด cron ซึ่งฉันพบว่า... น่ารำคาญ อย่างน้อยก็เมื่อเทียบกับการใช้ไฟล์บันทึก
fr flag
A.L
`0 0 * * echo "hello world" > /home/youssif/helloworld.log` จะลบบันทึกทุกวัน ด้วย `>>` จะเพิ่มเนื้อหาที่ส่วนท้ายของไฟล์ทุกวัน
mchid avatar
bo flag
@A.L ใช่ ฉันตัดสินใจทำแบบนั้นเพราะมันเหมือนกับการเปิดเทอร์มินัลและให้เอาต์พุตสำหรับเซสชันเดียวมากกว่า ฉันคิดว่าจะเป็นการดีกว่าถ้าเพิ่มวันที่นำหน้าบันทึกและดูเหมือนว่าจะทำให้คำตอบที่ซับซ้อนอยู่แล้วซับซ้อนขึ้น
Score:4
ธง cn

สามารถปฏิบัติตามข้อกำหนดเหล่านี้ได้อย่างง่ายดาย วิธีดั้งเดิมในการกำหนดเวลางานใน linux คือ crontab. วิธีที่ "ทันสมัย" ในการกำหนดเวลางานใน linux คือ ระบบ. crontab ยังคงได้รับการสนับสนุนบน Ubuntu

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

หากจำเป็น สามารถเปิดงานในโปรแกรมจำลองเทอร์มินัลแบบกราฟิกได้ อย่างไรก็ตาม สิ่งนั้นกำหนดให้คุณต้องเข้าสู่ระบบได้ตลอดเวลา ซึ่งอาจไม่ค่อยเหมาะสมนักจากมุมมองด้านความปลอดภัย

crontab และ/หรือ ระบบ ทำให้พึงพอใจ ข้อกำหนด 2. คุณจะเห็นรายการงานของคุณในผลลัพธ์ของ systemd รายการหน่วย หรือใน crontab ไฟล์. คุณสามารถเปิด/ปิด/ลบได้โดย ระบบ คำสั่งหรือโดยการลบ/เพิ่มความคิดเห็น # ลงชื่อต่อหน้างานหรือลบบรรทัดทั้งหมด

ข้อกำหนด 3 สามารถเขียนสคริปต์ได้อย่างง่ายดาย งานที่ตามมาสามารถอ่านได้ว่างานก่อนหน้านี้ทำอะไรไปแล้วบ้าง และดำเนินการตามนั้น

Score:0
ธง es

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

ที่ถูกกล่าวว่า... ซูเปอร์โครนิค เป็นตัวกำหนดเวลางานที่คุณสามารถเรียกใช้ในฐานะผู้ใช้ปกติ (ไม่ใช่รูท) ในเบื้องหน้า ซึ่งมีความสามารถในการบันทึกเอาต์พุตโดยตรงไปยังเทอร์มินัล มันอ่านไฟล์คล้าย crontab ซึ่งคุณสามารถระบุรายการของสคริปต์ที่จะรันและเวลาที่จะเรียกใช้ และคุณสามารถจัดเตรียมกระบวนการอัตโนมัติบางอย่างเพื่อแก้ไขไฟล์และส่งสัญญาณกระบวนการ supercronic เพื่อให้มันรับการเปลี่ยนแปลง . ดูเหมือนว่าจะตอบสนองทุกความต้องการของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา