ใช้ cronjob พร้อมพารามิเตอร์ต่าง ๆ ในแต่ละวัน


12

ฉันเป็นโปรแกรมเมอร์และไม่ทราบ crons มาก แต่ฉันต้องการที่จะรู้ว่ามันเป็นไปได้

ช่วยบอกฉันได้อาร์เรย์[option1, option2, option3]และสคริปต์ที่ผมทำงานใน NodeJS script.jsเรียกว่า ฉันต้องการเรียกใช้สคริปต์นี้ทุกวันเวลาตี 1 cronคำสั่งนี้จะเป็น:

0 1 * * * node ~/script.js

ตอนนี้ส่วนที่ยุ่งยากฉันต้องการหมุนตัวเลือกในแต่ละวันดังนั้นเช่นวันจันทร์ที่ฉันต้องการเรียกใช้node ~/script.js option1ในวันถัดไปnode ~/script.js option2เป็นต้น นอกจากนี้ฉันต้องการที่จะสามารถเพิ่ม / ลบตัวเลือกเมื่อจำเป็น แต่การหมุนควรจะยังคงเหมือนเดิม

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


2
ฉันอยากจะแนะนำสคริปต์นี้ vs พยายาม cron ทำด้วยตัวเอง
earthmeLon

คำตอบ:


15

นอกจากนี้ฉันต้องการที่จะสามารถเพิ่ม / ลบตัวเลือกเมื่อจำเป็น แต่การหมุนควรจะยังคงเหมือนเดิม

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

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

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

ถ้าคุณต้องการคุณสามารถเขียนสิ่งนี้ในบรรทัดเดียวสำหรับ cron เช่นกันแม้ว่ามันจะยากที่จะอ่าน

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


+1 อย่างแน่นอนสำหรับวิธีที่คุณจัดการลำดับตัวเลือกใน "การแก้ไขรายการ"
Hagen von Eitzen

ขอบคุณสำหรับคำตอบฉันชอบมันและจะใช้มัน ลำดับการหมุนที่แน่นอนนั้นไม่สำคัญเมื่อฉันเพิ่มรายการใหม่ลงในรายการ สิ่งเดียวที่สำคัญคือพวกเขาทั้งหมดได้รับ 1-2 ครั้งต่อสัปดาห์ในแต่ละสัปดาห์และไม่ใช่สองอย่างในวันเดียวกัน
Saif Bechan

2
$(ls -rt | head -n1)จะแน่นอนแบ่งชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่ แต่เพื่อจุดประสงค์นี้คุณอาจจะได้รับเพียงกับ "อย่าทำอย่างนั้น"
cjm

20

สมมติว่าคุณต้องการตัวเลือกที่แตกต่างกันในแต่ละวันของสัปดาห์ คุณสามารถ:

  1. มีงาน cron แยกต่างหากสำหรับสิ่งเหล่านี้:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    ฯลฯ ...

  2. มีbashตัวเลือกที่ต้องการสำหรับคุณ:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (ฉันไม่ได้ทำงานหลังดังนั้นมันอาจต้องปรับแต่ง - แต่นั่นเป็นความคิดทั่วไป)


2
ขอบคุณสำหรับคำตอบ แต่ฉันคิดว่ามันจะยุ่ง ฉันต้องกำหนดอาเรย์ที่ไหนสักแห่งจริง ๆ แล้วมันจะไม่ทำงาน ฉันไม่สามารถทำงานกับecho option1ฯลฯ ได้เนื่องจากตัวเลือกของฉันอาจแตกต่างกันไปในแต่ละสัปดาห์ ฉันจะทำสิ่งนี้ในแอป Node ของฉันและติดตามว่าฉันใช้งานฐานข้อมูลตัวไหนในฐานข้อมูล
Saif Bechan

13

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


+1 กุญแจคือ 'ไม่สะอาด'
เปาโล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.